Java의 키워드들(static
, final
, 변수, 메서드 등)와 JVM 메모리 영역(Stack/Heap/Method Area)과의 관계
✅ Java의 키워드들과 JVM 메모리 영역의 관계 정리
📚 1. JVM 메모리 구조 요약
자바 프로그램이 실행되면, JVM(Java Virtual Machine)은 내부적으로 다음과 같은 메모리 영역을 구성하여 클래스 정보, 객체, 메서드 호출 정보 등을 저장하고 관리합니다.
┌──────────────────────────┐
│ Method Area │ ← 클래스 정보, static 변수, static 메서드, 상수 풀 등
├──────────────────────────┤
│ Heap Area │ ← 객체(instance), 인스턴스 변수
├──────────────────────────┤
│ Stack Area │ ← 메서드 호출 시 사용하는 지역 변수, 매개변수, 연산 중 임시값
├──────────────────────────┤
│ PC Register │ ← 쓰레드별 현재 명령어 위치 저장
├──────────────────────────┤
│ Native Method Stack │ ← 자바 외 C 등의 네이티브 메서드 호출 시 사용
└──────────────────────────┘
실무에서 가장 자주 다루게 되는 영역은 Method Area, Heap, Stack입니다.
🔎 2. 메모리 영역별 역할 정리
메모리 영역 | 저장하는 내용 | 생성 시점 | 소멸 시점 | 예시 |
Method Area | 클래스 정보, static 변수/메서드, 상수 | 클래스 로딩 시 | JVM 종료 시 | static int x, public static void main() |
Heap | new로 생성된 객체, 인스턴스 변수 | 객체 생성 시 | 참조 해제 후 GC | new Person(), p.name |
Stack | 지역 변수, 매개변수, 호출 스택 프레임 | 메서드 호출 시 | 메서드 종료 시 | int i = 0, String msg |
✅ 3. Java 키워드와 JVM 메모리 영역 관계
1️⃣ static → Method Area
class MyClass {
static int count = 0;
}
- count는 객체별로 따로 존재하지 않고, 클래스당 하나의 저장공간만 존재.
- 클래스가 JVM에 처음 로딩될 때 Method Area에 1회만 생성됨.
- → 클래스 객체가 생성되는 것이 아니라 클래스 "정보 자체"가 올라감
- 객체를 생성(new MyClass() )하지 않아도 MyClass.count 로 접근 가능.
2️⃣ 인스턴스 변수 → Heap 영역
class Person {
String name; // 인스턴스 변수
}
Person p = new Person(); // new Person()은 Heap에 저장
- p 객체와 그 안의 name 필드는 모두 Heap에 저장됨.
- 객체마다 독립된 인스턴스 변수를 가짐.
3️⃣ 지역 변수, 매개변수 → Stack 영역
void greet(String message) {
int count = 0;
}
- message, count는 메서드 호출 시 Stack Frame에 저장됨.
- 메서드 실행 종료 시 자동으로 소멸됨.
4️⃣ final 키워드 → 메모리 위치가 아니라 값 변경 금지와 관련
final int localMax = 10; // Stack에 저장됨 (지역 변수)
public static final int MAX = 100; // Method Area에 저장됨 (상수)
- final은 값을 재할당할 수 없도록 제한하는 키워드일 뿐, 메모리 위치를 결정하지 않음.
- 저장 위치는 변수의 종류(static, 지역, 인스턴스)에 따라 결정됨.
- static final의 경우: Method Area에 상수처럼 올라감
🔥 4. 요약 정리표: 키워드별 저장 위치
항목 | 예시 | 저장 영역 | 특징 |
static 변수 | static int count; | Method Area | 클래스 로딩 시 1회 생성 |
final 변수 | final int x = 10; | Stack(지역) 또는 Heap(필드) | 값 재할당 불가 |
인스턴스 변수 | String name; | Heap | 객체마다 별도 존재 |
지역 변수 | int i = 0; | Stack | 메서드 종료 시 소멸 |
매개변수 | void m(int x) | Stack | 메서드 호출 시 스택 프레임 생성 |
static 메서드 | static void f() | Method Area | 객체 없이 호출 가능 |
인스턴스 메서드 | void run() | Method Area(코드), Stack(호출 시) | 객체 필요 |
🧠 5. 비유로 이해하기
영역 | 비유 |
Method Area | 클래스의 설계도면이 저장된 기계 도면실 (static, 코드, 상수 등 정적 자원 저장) |
Heap | 객체가 실제로 만들어지는 공장 창고 (인스턴스 변수 등) |
Stack | 작업 중인 정보를 담아두는 작업자의 메모장 (지역 변수, 매개변수 등) |
❗ 6. 자주 혼동되는 오해 vs 진실
오해 | 진실 |
static 변수는 객체 생성 시 메모리에 올라간다 | ❌ 클래스 로딩 시 Method Area에 올라감 |
static 메서드는 객체를 생성해야 호출할 수 있다 | ❌ 객체 없이 클래스명으로 직접 호출 가능 |
final은 메모리 구조와 관련 있다 | ❌ 메모리 위치가 아니라 값의 재할당 금지 의미 |
✅ 7. 예시 코드로 메모리 위치 표시
public class Student {
static String schoolName = "KHS"; // Method Area
String name; // Heap
int age; // Heap
public static void main(String[] args) {
int localNum = 100; // Stack
Student s = new Student(); // s → Stack (참조), new Student() → Heap
s.name = "Tom"; // Heap
s.age = 17; // Heap
}
public static void staticMethod() {
// Method Area에 저장됨
}
public void instanceMethod() {
// 메서드 코드는 Method Area에 있으나,
// 호출 시 지역 변수는 Stack, 인스턴스 필드는 Heap
}
}
✅ 8. static 변수/메서드가 메모리에 올라가는 시점은?
- 클래스가 처음 로딩될 때
- JVM이 MyClass.count 또는 MyClass.staticMethod() 와 같이 클래스 이름으로 접근하는 순간(해당 클래스를 사용하는 순간),
- Method Area에 클래스 정보 + static 필드/메서드가 올라감 (1번만)
System.out.println(MyClass.count); // 클래스가 로딩되며 static 요소들 Method Area에 올라감
✔️ new 연산으로 객체 인스턴스를 생성하지 않아도,
→ 클래스 로딩이 발생하고, static 요소들이 Method Area에 올라갑니다.
'Java' 카테고리의 다른 글
[Java] 자바 생성자 확장 설명 (생성자 체이닝, 생성자 오버로딩) (0) | 2025.04.08 |
---|---|
[Java] 자바에서 기본 생성자의 자동 생성 여부와 사용 조건 (0) | 2025.04.08 |
[Java] Java 키워드 조합 의미 (0) | 2025.04.08 |
[Java] Java 키워드 정리 (0) | 2025.04.08 |
[Java] static 키워드의 메모리 구조, 사용 시기, 고전적 관점 vs 현대적 관점 (0) | 2025.04.08 |
댓글