(JAVA) int 자료형 - 메모리, 비트, 내부 구조, 오버플로우까지 깊게 파헤치치기
1️⃣ int 의 본질 -컴퓨터는 왜 4바이트를 선택했는가?
자바의 int는 32비트 (4바이트) 정수형 입니다.
이 구조는 자바가 아닌 하드웨어와 운영체제의 역사적인 기준 맞춰 설정된 것입니다.
- 초기 컴퓨터 아키텍처에서는 32비트 레지스터를 기준으로 설계된 cpu가 많았고,
그래서 자바도 int 32비트 정수형으로 기준화했습니다.
✅ "4바이트 = 32비트"란?
1 바이트= 8비트 -> 4바이트는 = 32 비트
32 비트로 표현 가능한 숫자 범위 :
부호 있는 경우: -2^31 ~2^31 -1 (약 -21억 ~ 21억)
부호 없는 경우 : 0 2^32 -1 (자바는 지원하지 않음)
🎯 컴퓨터 아키텍처란?
컴퓨터 아키텍처(Computer Architecture)
컴퓨터 아키텍처는 컴퓨터를 어떤 방식으로 만들고, 어떻게 작동하게 할 것인가에 대한 설계도(디자인 청사진)이야
우리가 생각하는 컴퓨터는 마치 공장처럼 작동해
- 어디에 정보를 저장하고
- 어디서 계산하고
- 어떻게 입력을 받고
-어떻게 출력을 보여줄지
이런 모든 걸 정의하는게 아키텍처야!
📘 왜 아키텍처가 필요할까?
초창기에는 모든 컴퓨터가 설계가 다 달랐어.
그러니 프로그램도 기계마다 전부 새로 짜야 했고, 효율도 떨어졌지.
그래서 어떤 천재가 나와서 말했다.
| 야!! 컴퓨터 구조를 표준화해서 만들자! 그러면 누구나 같은 방식으로 컴퓨터를 만들고, 프로그램도 쉽게 만들 수 있잖아!!
이 천재가 바로........
🧠 존 폰 노이만(John Von Neumann)
폰노이만
- 1945년에 폰 노이만 아키텍처를 제안
- 이후 모든 컴퓨터의 기본 설계 원리가 되었어
🏗️ 폰 노이만 아키텍처 구조
이 구조는 다음 5가지 요소로 구성돼 있어:
1. 중앙 처리 장치(CPU)
- 연산, 명령어 실행의 중심
- 내부에 산술논리연산장치(ALU), 제어장치(Control Unit) 포함
2. 메모리(Memory)
- 명령어 + 데이터를 저장
- 프로그램 내장 방식! (중요)
3.입력 장치(Input Device)
- 키보드, 마우스 등
4. 출력 장치(Output Device)
- 모니터, 프린트 등
5. 버스(Bus)
⚙️ 실행 흐름: 컴퓨터는 이렇게 동작해
1. 메모리에 저장된 명령어를 읽고
2. CPU가 명령어를 해석하고
3. 필요한 데이터를 읽고 계산하고
4. 출력하거나 다시 저장해
➡️ 이걸 초당 수억 ~수십억 번 반복!
📊 폰 노이만 VS 하버드 아키텍처
항목 폰 노이만 하버드
명령어/데이터 저장 | 같은 메모리 공간 | 분리된 메모리 공간 |
데이터 버스 | 하나 | 두 개 |
처리 속도 | 느릴 수 있음 (버스 충돌) | 빠름 |
사용처 | 범용 컴퓨터 | 임베디드 시스템 (마이크로칩 등) |
📚 용어 정리
영어 한국어Computer Architecture | 컴퓨터 아키텍처 |
Von Neumann Architecture | 폰 노이만 아키텍처 |
ALU (Arithmetic Logic Unit) | 산술논리연산장치 |
Control Unit | 제어 장치 |
Memory | 메모리 (기억 장치) |
Bus | 버스 (데이터 통로) |
Harvard Architecture | 하버드 아키텍처 |
👀 아키텍처를 배우면 좋은 이유
- CPU가 어떻게 작동하는지 이해하게 되고
- Java 같은 고급 언어 코드가 메모리에서 어떻게 실행되는지 알 수 있어
- JPA, Spring에서 동작하는 하위 구조의 본질까지 감 잡을 수 있어 !
2️⃣비트 단위에서의 저장 원리 - 부호 비트와 2의 보수 표현
자바의 int는 부호 있는 정수이므로 2의 보수( Two's Complement)방식으로 저장됩니다.
✅ 왜 2의 보수를 쓸까?
덧셈/뺄셈을 하드웨어적으로 간단히 처리하기 위해
음수 표현을 부호비트만으로 해결하지 않고, 비트 전체로 표현
📦예시 : int x = - 5; (차후 추가 해석 공부 필요)
+5 = 00000000 00000000 00000000 00000101
- 5의 2의 보수:
1. 1의 보수 : 11111111 11111111 11111111 11111010
2 . +1 : 11111111 11111111 11111111 11111011
그래서 -5는 위와 같은 32비트 비트열로 메모리에 저장됨
2의 보수(Two's Complement)란?
— 음수를 비트로 표현하는 컴퓨터의 방법
🔧먼저 배경부터: 컴퓨터는 음수를 이해하지 못한다!
컴퓨터는 오직 0과 1만 이해할 수 있어.
그래서 우리가 쓰는 -5, +10 같은 양수/음수는
**전기 신호(비트 패턴)**로 바꿔줘야 해.
📌 그런데 양수는 쉽게 표현할 수 있지만,음수는 표현 방법이 여러 가지 중에 선택이 필요해.
그래서 가장 많이 쓰이는 방법이 2의 보수 방식이야.
📘 1. 비트와 바이트 복습
- 1비트 = 0 또는 1
- 1바이트 = 8비트
- 자바의 int는 32비트 = 4바이트
즉, 자바에서 숫자 하나를 저장할 때
→ 32개의 0과 1로 구성된 이진수로 저장해
✅ 2. 그럼 양수는 어떻게 저장돼?
int x = 5;
--> 메모리에 저장될 때;
00000000 00000000 00000000 00000101
이건 2진수로 5를 표현한 것.
맨 앞 비트는 부호 비트 (0 = 양수)
❓ 그럼 -5는 어떻게 표현하지?
자바는 2의 보수 방식으로 음수를 표현해.
2의 보수 계산 방법:
어떤 양수의 2의 보수를 구하려면
1. 1의 보수(모든 비트 반전: 0→1, 1→0)
2. "+1"
예시 : int x = -5;
1 단계 : +5의 이진수 표현
00000000 00000000 00000000 00000101
2단계: 1의 보수 (0 → 1, 1 → 0)
11111111 11111111 11111111 11111010
3단계: 2의 보수 = 1의 보수 + 1
11111111 11111111 11111111 11111011
✅ 이게 바로 -5가 메모리에 저장되는 실제 비트 패턴
🎯 왜 이렇게까지 복잡하게 2의 보수를 쓸까?
답 : 덧셈과 뺄셈을 쉽게 하기 위해!
예시 :
int a = 5;
int b = -5;
System.out.println(a + b); // 결과는 0
컴퓨터는 5 + (-5)를 그냥 이진수 덧셈으로 계산해
2의 보수로 -5를 표현하면, 덧셈만으로 뺄셈까지 자동 처리됨
그래서 계산이 빠르고 회로도 단순하게 설계할 수 있어!
🧾 실제로 쓰이는 범위 정리 (32비트 기준)
값 | 10진수 | 비트 표현 (앞부분만 생략) |
최대값 | +2,147,483,647 | 01111111...111 |
최소값 | -2,147,483,648 | 10000000...000 |
자리수 (오른쪽부터) 위(5) 아래(-5) 합 남는 값 올림(Carry)
1번 자리 (맨 끝) | 1 | 1 | 2 | 0 | 1 |
2번 자리 | 0 | 1 | 1+올림1 = 2 | 0 | 1 |
3번 자리 | 1 | 0 | 1+올림1 = 2 | 0 | 1 |
4번 자리 | 0 | 1 | 1+올림1 = 2 | 0 | 1 |
5번 자리 | 0 | 1 | 1+올림1 = 2 | 0 | 1 |
6번 자리 | 0 | 1 | 1+올림1 = 2 | 0 | 1 |
7번 자리 | 0 | 1 | 1+올림1 = 2 | 0 | 1 |
8번 자리 (맨 앞) | 0 | 1 | 1+올림1 = 2 | 0 | 1 (버림) |
마지막 버려지는 이유는 8비트인데 9칸이 되어서 넣을 수 없기에 버려짐 그래서 값은 0이야
3️⃣ 오버플로우란 무엇인가?
overflow란, 변수의 최대 범위를 초과했을 때 발생하는 현상입니다.
int max = Integer.Max_VALUE; // 2147483647
System.out.printLn(max+1); // -2147483648 (어째서 -마이너스값이 앞에 붙었는지 추후 확인 요망)
🔥 왜 이런 일이 발생할까?
32비트 한계를 넘으면 비트가 순환(wrap around)하여 음수의 최솟값(-2^31)로 돌아가기 때문입니다.
4️⃣ 자바 컴파일러와 int 상수 처리
int x = 2147483648;
위 코드는 컴파일 타임에 에러가 납니다.
왜냐하면:
1. 숫자 리터럴 2147483648 은 기본적으로 int로 인식
2.int 의 범윌흘 벗어나므로 컴파일러가 타입 불일치로 오류 발생
3. 해결 long x = 2147483648L; -> L 붙여야 long으로 간주
5️⃣JVM 내부에서의 int 관리 (JVM이 뭔지 확인 요망)
JVM은 스택 기반 구조
지역 변수롤 선언된 int는 스택 프레임의 로컬 변수 배열에 저장 (확인 요망)
연산 시, 오퍼랜드 스택에서 꺼내어 계산 (확인 요망)
📦 5️⃣ JVM 내부에서의 int 관리
1️⃣ JVM이란?
| Java Virtual Machine(자바 가상 머신)
📌 한 줄 정의:
자바 프로그램을 실행해주는 가상의 컴퓨터야
🧠왜 '가상 머신'이 필요해?
자바는 원래 철학이:
|"한 번만 작성하면, 어디서든 실행된다!"
👉그래서 자바 코드를 운영체제에 따라 다르게 실행시키기 위해
👉 자바 전용**가상 머신(JVM)**이 필요함!
2️⃣ JVM 구조 전체 그림
JVM 내부에는 이런 구성 요소들이 있어:
[메모리 구조]
├─ 메소드 영역 (Method Area)
├─ 힙 영역 (Heap)
└─ 스택 영역 (Stack) ← 우리가 집중할 부분
3️⃣ 스택 프레임(Stack Frame)이란?
자바에서 메서드 하나가 호출될 때마다
JVM의 스택에 "스택 프레임"이라는 구조가 생겨요.
📦 비유:
| 메서드 호출마다 작은 작업 박스 하나가 생긴다고 생각해봐.
이 박스가 바로 스택 프레임!
스택 프레임 안에는 다음 두 가지가 있어요:
1.로컬 변수 배열
2. 오퍼랜드 스택
4️⃣ 로컬 변수 배열이란?
| 메서드 내부에서 선언된 변수들이 저장되는 공간
예:
public static void main(String[] args){
int a =5;
}
👉 a 라는 변수는 JVM이 생성한 스택 프레임의
👉 **로컬 변수 배열 (Local Variables)**에 저장돼.
📦 비유:
| 변수 하나하나를 담는 작은 칸들이 줄지어 있는 책꽃이라고 생각하면 돼.
5️⃣ 오퍼랜드 스택(Operand Stack)이란?
| 연산할 값들을 잠깐 올려두는 작업대
예를 들어:
int a = 5;
int b = 3;
int c = a + b;
JVM 은 이렇게 행동해:
1 . a의 값 5 -> 오퍼랜드 스택에 올림
2. b의 값 3 -> 오퍼랜드 스택에 올림
3. iadd(int add)실행 -> 두 숫자 꺼내서 더함 ------ iadd (iadd = int add) -> 자바의 int 형 정수를 더하는 JVM명령어
4. 그 결과를 C 라는 변수
📦 비유 :
덧셈을 하기 전에 값을 임시로 **작업대(스택)**에 올려놓거
계산 후 다시 결과를 **책꽂이(로컬 변수 배열)에 넣는 거야!
💻 실제 바이트코드 예시
int a = 5;
int b = 3;
int c = a + b;
javap -c 결과: -----> 의미 (javap -c란? 자바 클래스 파일(.class)에 들어 있는 바이트 코드를 보여주는 명령어)
📘 한 줄 정의: javap는 자바 클래스 분석기(Decompiler)이고,
-c 옵션은 그 클래스 안의 **바이트코드(기계어 수준의 명령어)**를 보여주는 기능이야.
📦 언제, 왜 쓰는가?
자바는 우리가 작성한 .java 파일을 컴파일하면 -> .class 파일로 바뀌지?
이 .class 파일은 JVM이 이해하는 바이트 코드로 되어 있어
그걸 눈으로 확인하려면?
👉 바로 javap -c를 쓰는 거야!
iconst_5 → 5를 오퍼랜드 스택에 올림
istore_1 → 로컬 변수 1번 자리에 저장
iconst_3 → 3을 오퍼랜드 스택에 올림
istore_2 → 로컬 변수 2번 자리에 저장
iload_1 → a의 값(5)을 스택에 올림
iload_2 → b의 값(3)을 스택에 올림
iadd → 두 개를 더함 (5 + 3)
istore_3 → 결과를 변수 c에 저장
🧾 전체 요약 그림
[메서드 호출 시 JVM 구조]
┌─────────────┐
│ 스택 프레임 (main) │
│ ┌────────────┐
│ │ 로컬 변수: a, b, c │ ← 저장소
│ └────────────┘
│ ┌────────────┐
│ │ 오퍼랜드 스택 │ ← 계산대
│ └────────────┘
└─────────────┘
🇯🇵 일본어 용어 정리
한국어 영어 일본어 히라가나
자바 가상 머신 | JVM | Java仮想マシン | じゃばかそうましん |
스택 프레임 | Stack Frame | スタックフレーム | すたっくふれーむ |
로컬 변수 배열 | Local Variables | ローカル変数配列 | ろーかるへんすうはいれつ |
오퍼랜드 스택 | Operand Stack | オペランドスタック | おぺらんどすたっく |
예) 바이트코드 확인
public static void main(String[] args) {
int a =5;
int b =3;
int c = a + b;
}
javap -c Main.class 결과 :
iconst_5
istore_1
iconst_3
istore_2
iload_1
iload_2
iadd
istore_3
--> int 연산은 JVM 레벨에서 iadd, iload, istore로 처리됨
JP 일본어 IT 용어 (심화)
한국어 영어 일본어 히라가나
한국어 | 영어 | 일본어 | 히라가나 |
정수형 | integer | 整数型 | せいすうがた |
부호 비트 | sign bit | 符号ビット | ふごうびっと |
2의 보수 | two's complement | 二の補数 | にのほすう |
오버플로우 | overflow | オーバーフロー | おーばーふろー |
스택 프레임 | stack frame | スタックフレーム | すたっくふれーむ |
다음 시간 공부할 것
다음 내용으로는 long, BigInteger, 그리고 int를 객체처럼 다루는 Integer 클래스까지 이어가면
진짜 실무와 라이브러리 수준까지 분석할 수 있어요.
이 내용을 티스토리 블로그 글 형식으로 정리해줄까?
또는 Markdown 포맷으로도 제작해줄 수 있어요!
よろしくお願いします 😊