| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- java8
- 정규식
- 자료구조강의추천
- CodeLatte
- Android
- 개발자
- thread
- 데이터베이스기초
- CodeCommit
- 자바8
- 람다
- 백엔드 개발 코딩 강의
- 스트림
- 안드로이드
- 코딩독학방법
- 백엔드 코딩
- lamda
- C포인터
- 문돌이
- java
- 백엔드 강의
- 데이터베이스강의
- 스타트업
- 코딩입문
- Stream
- 코드라떼
- 자바
- 자바자료구조
- 오류제어
- RFC
- Today
- Total
이병록의 개발 블로그
[코드라떼] 자바 프로그래밍 - [심화] 리터럴과 메모리의 관계 본문
목차
ㅤ
1. 리터럴은 일시적으로 스택에 저장된다(접미사 L, F 의미)
이후에 자바 메모리 모델 강의에서 배우지만 문자열 리터럴을 제외하고 byte, short, int, long, float, double, boolean, char 리터럴은 스택이라는 특정한 메모리 공간에 일시적으로 적재됬다가 변수라는 메모리 공간에 저장됩니다.
정수형 데이터인 경우는 기본적으로 약 21억이 넘어가는 크기의 상수가 아닌 이상 그 이하의 수는 기본적으로 4 byte 크기로 스택 메모리 공간에 적재됩니다. 그러나 21억이 넘어가는 리터럴 값인 경우, 큰 수를 표현하기 위해서는 8 byte의 메모리 공간이 필요하므로 자바 언어를 실행하는 가상머신에게 4 byte가 아닌 8 byte 크기의 메모리 공간에 할당해 줘야 하는 리터럴 값이라고 명시해야 합니다. 그것을 명시하기 위해서 접미사 L을 작성해 주는 겁니다.
실수형 데이터인 경우는 기본적으로 8 byte 크기로 스택 메모리 공간에 적재됩니다.(4byte를 두 개로 나누어서 저장합니다) 그러나 4 byte로 표현하는 실수형 리터럴은 자바 언어를 실행하는 가상머신에게 8 byte가 아닌 4 byte 크기의 메모리 공간에 할당해 줘야 하는 리터럴 값이라고 명시해야 합니다. 그것을 명시하기 위해서 접미사 F을 작성해 주는 겁니다.
지금은 이 정도만 알고 가는 것이 좋습니다.
ㅤ
2. 리터럴이 변수에 저장 시, 변환 결과 정리
| 리터럴 | -> | 변수 |
|---|---|---|
| byte (4 byte 할당) | -> | byte (1 byte로 저장) |
| short (4 byte 할당) | -> | short (2 byte로 저장) |
| int (4 byte 할당) | -> | int (4 byte에 저장) |
| long (접미사 붙일 시, 8 byte 할당) | -> | long (8 byte로 저장) |
| float (접미사 붙일 시, 4 byte 할당) | -> | float (4 byte로 저장) |
| double (8 byte 할당) | -> | double (8 byte로 저장) |
| boolean (설계상 1bit, 실제 구현체에서는 4 byte 할당) | -> | boolean (1 byte로 저장) |
| char (4 byte 할당) | -> | char (2 byte로 저장) |
리터럴은 특정한 공간인 operand stack(이후에 배움)에 일시적으로 적재된 후 변수에 저장할 때는 형변환을 통해 변수에 저장됩니다.
ㅤ
3. [심화] 32.123456789F와 32.123456789는 같지 않다.
두 가지 변수가 있습니다.
double bigRealNumber1 = 32.123456789F;
double bigRealNumber2 = 32.123456789;
두 변수의 차이는 단지 접미사 F가 작성되어 있느냐, 작성되어 있지 않느냐의 차이입니다.
다만, 접미사 존재 여부에 따라 저장되는 값이 달라집니다.
//bigRealNumber1
0100000001000000000011111100110101100000000000000000000000000000
//bigRealNumber2
0100000001000000000011111100110101101110100110111001110010110010
[심화]정수와 실수 강의에서 float와 double에 대한 부동소수점 방식에 대해서 설명드렸는데요. 부동소수점 방식은, 부호, 지수부, 가수부 세 가지로 나뉩니다.
double bigRealNumber1 = 32.123456789F;
32.123456789F는 32bit 공간의 메모리에 float 부동소수점 방식으로 저장됩니다. 그런데 double 자료형에 저장될 때 32bit 에서 64bit로 암시적 형변환이 발생하는데 암시적 형변환의 규칙은 다음과 같습니다.
- 지수부를 추출하고 추출한 지수부를 32 bit 에서 64 bit 배정도 방식으로 변환한다
- 가수부는 그대로 사용한다
- 비어 있는 공간에 0 bit 패딩을 채워 넣는다

3-1. '32.123456789F' (32 bit)의 비트 표현
0 10000100 00000000111111001101011
ㅤ
3-2. '32.123456789F' (32 bit) -> (64 bit)의 비트 표현
0 10000000100 00000000111111001101011 00000000000000000000000000000 (0 비트 패딩추가)
ㅤ
3-3. '32.123456789' (64 bit)의 비트 표현
0 10000000100 00000000111111001101011 01110100110111001110010110010
결론적으로 64 bit 상수 32.123456789와 32 bit 상수 32.123456789F는 서로 다를 수 밖에 없습니다.
'자바 프로그래밍 강의' 카테고리의 다른 글
| [코드라떼] 자바 프로그래밍 - [심화] 형 변환 원리 (0) | 2026.01.31 |
|---|---|
| [코드라떼] 자바 프로그래밍 - 형 변환 (0) | 2026.01.31 |
| [코드라떼] 자바 프로그래밍 - 상수 (0) | 2026.01.31 |
| [코드라떼] 자바 프로그래밍 - [심화] 정수와 실수 (0) | 2026.01.31 |
| [코드라떼] 자바 프로그래밍 - 정수와 실수 (0) | 2026.01.31 |
