숏컷 코드
// 정수
byte b = 127; // 1바이트, -128 ~ 127
short s = 32_000; // 2바이트
int i = 2_147_483_647; // 4바이트 — 기본 정수 타입
long l = 10_000_000_000L; // 8바이트, 리터럴에 L 필요
// 실수
float f = 3.14f; // 4바이트, 리터럴에 f 필요
double d = 3.14; // 8바이트 — 기본 실수 타입
// 기타
char c = 'A'; // 2바이트, 유니코드 문자
boolean active = true; // true / false
// 참조 타입
String name = "RefDock"; // 객체, null 가능
// var — 타입 추론 (Java 10+)
var count = 42; // int로 추론
var items = new ArrayList<String>(); // ArrayList<String>으로 추론
// 상수 — final
final int MAX_RETRY = 3;문법
어떤 타입을 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 것 |
|---|---|
| 일반 정수 | int |
| 큰 정수 | long + L |
| 일반 실수 | double |
| 상태 플래그 | boolean |
| 문자 하나 | char |
| 문자열·배열·객체 | reference type |
8가지 primitive type
| 타입 | 크기 | 범위 / 특징 |
|---|---|---|
byte | 1바이트 | -128 ~ 127 |
short | 2바이트 | -32,768 ~ 32,767 |
int | 4바이트 | -2,147,483,648 ~ 2,147,483,647 |
long | 8바이트 | 약 ±9.2 × 10¹⁸, 리터럴에 L 접미사 |
float | 4바이트 | 소수점 약 7자리, 리터럴에 f 접미사 |
double | 8바이트 | 소수점 약 15자리 — 기본 실수 타입 |
char | 2바이트 | 유니코드 문자 ('\u0000' ~ '\uffff') |
boolean | — | true / false |
정수 기본값은 int, 실수 기본값은 double입니다. long과 float은 리터럴에 L·f 접미사가 없으면 컴파일 오류가 납니다.
primitive vs reference 타입
Java 타입은 크게 primitive type과 reference type으로 나뉩니다. int, double, boolean, char 같은 primitive는 값을 직접 담고, String·배열·클래스 인스턴스는 참조를 통해 다룹니다. 이 차이가 메모리 구조와 비교 방식에서 계속 이어집니다.
int a = 5;
int b = a; // 값 복사
b = 10; // a는 여전히 5
String s1 = new String("hello");
String s2 = s1; // 참조 복사 (같은 객체를 가리킴)String은 primitive가 아닌 객체
String은 문자처럼 자주 쓰이지만 primitive가 아니라 객체입니다. 그래서 length() 같은 메서드를 가지며, == 비교는 참조를 비교하고 equals()는 값을 비교합니다. 이 차이를 모르면 문자열 비교 버그가 조용히 발생합니다.
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false (참조가 다름)
System.out.println(a.equals(b)); // true (값이 같음)형변환: widening과 narrowing
더 넓은 수 표현으로 가는 widening은 자동으로, 정보 손실 가능성이 있는 narrowing은 명시적 cast가 필요합니다. Java는 초기화되지 않은 지역 변수를 바로 쓸 수 없어서, 이 규칙이 컴파일 단계에서 많은 오류를 잡아 줍니다.
int i = 42;
double d = i; // widening: 자동 변환
int back = (int) d; // narrowing: 명시적 cast 필요, 소수점 손실int vs long, double vs float
대부분의 숫자 코드는 int와 double에서 시작합니다. 범위가 더 크거나, 외부 API 계약 때문에 타입이 정해져 있을 때만 long, float, byte, short로 내려가는 편이 자연스럽습니다.
// 일반적인 카운터/인덱스
int count = items.size();
// 20억을 넘길 수 있는 ID/누적값
long totalBytes = 5_000_000_000L;
// 기본 실수 계산
double price = 19.99;
// 외부 API가 float를 요구할 때만
float ratio = 0.75f;선택 기준
| 상황 | 적합한 선택 |
|---|---|
| 일반 정수 연산 | int |
| 큰 수 (20억 초과) | long + L 접미사 |
| 일반 실수 연산 | double |
| 문자열, 객체, 배열 | reference type (String, 클래스 인스턴스) |
| 변경 불가 변수 | final |
| 타입 반복이 길 때 | var (Java 10+) |
| 문자열 값 비교 | equals() (== 금지) |
| 더 좁은 타입으로 변환 | 명시적 (int) cast 필요 |
주의할 점
String은 primitive가 아닙니다. ==로 비교하면 값이 아니라 참조를 비교합니다.
// ❌ == 비교 — 참조가 다르면 같은 내용도 false
String a = new String("hello");
String b = new String("hello");
if (a == b) { ... } // false!
// ✅ equals()로 값 비교
if (a.equals(b)) { ... } // truelong과 float 리터럴 접미사를 빠뜨리면 컴파일 오류나 의도와 다른 타입 추론이 나옵니다.
// ❌ 10_000_000_000은 int 범위를 넘어 컴파일 오류
long bytes = 10_000_000_000;
// ✅ long 리터럴
long bytes = 10_000_000_000L;
// ❌ 3.14는 double 리터럴
float ratio = 3.14;
// ✅ float 리터럴
float ratio = 3.14f;참고 링크
2 sources