☕ Java 정수 타입 완전 정복
핵심 요약: Java는 정수를 저장하기 위해 5가지 타입을 제공한다.
타입마다 메모리 크기가 다르고, 그에 따라 저장 가능한 값의 범위가 달라진다.
1️⃣ 정수 타입 한눈에 보기
| 타입 | 메모리 크기 | 저장 가능한 값의 범위 |
|---|---|---|
byte | 1byte (8bit) | -128 ~ 127 |
short | 2byte (16bit) | -32,768 ~ 32,767 |
char | 2byte (16bit) | 0 ~ 65,535 (유니코드) |
int | 4byte (32bit) | -2,147,483,648 ~ 2,147,483,647 |
long | 8byte (64bit) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
💡 값의 범위를 다 외울 필요는 없다. 메모리 크기(bit 수) 만 기억하자!
2️⃣ 메모리 구조와 부호 비트
정수 타입은 메모리에서 아래와 같이 2진수로 저장된다.
- 최상위 bit(MSB) = 부호 비트
0이면 양수,1이면 음수
- 나머지 bit가 실제 값의 범위를 결정
| 최상위 bit | 값의 범위 |
|---|---|
0 | 0 ~ (2^(n-1) - 1) |
1 | -2^(n-1) ~ -1 |
음수는 어떻게 저장될까? — 2의 보수
-2가 메모리에 저장되는 과정:
① -2의 2진수: 1 1 1 1 1 1 1 0
② 1의 보수: 0 0 0 0 0 0 0 1 (0↔1 반전)
③ +1: 0 0 0 0 0 0 1 0 → 10진수로 2
④ 부호 적용: -2 ✅
3️⃣ 정수 리터럴 작성법
코드에 직접 작성하는 값을 리터럴(Literal) 이라고 한다. Java는 4가지 진수 표기를 지원한다.
| 진수 | 접두사 | 예시 | 10진수 값 |
|---|---|---|---|
| 2진수 | 0b / 0B | 0b1011 | 11 |
| 8진수 | 0 | 013 | 11 |
| 10진수 | 없음 | 365 | 365 |
| 16진수 | 0x / 0X | 0xB3 | 179 |
int bin = 0b1011; // 2진수 → 11
int oct = 013; // 8진수 → 11
int dec = 365; // 10진수 → 365
int hex = 0xB3; // 16진수 → 179
4️⃣ 주의사항 — 범위 초과 & long 타입
⚠️ 범위를 초과하면 컴파일 에러!
byte var = 127; // ✅ 정상
byte var = 128; // ❌ 컴파일 에러: cannot convert from int to byte
⚠️ long 타입은 L 접미사 필수!
컴파일러는 정수 리터럴을 기본적으로 int로 간주한다.
int 범위를 초과하는 값은 반드시 L(또는 l) 을 붙여야 한다.
long ok = 1000000000000L; // ✅ L 접미사 붙임
long err = 1000000000000; // ❌ 컴파일 에러: int 범위 초과
💡 소문자
l은 숫자1과 혼동될 수 있으므로 대문자L사용을 권장한다.