새발블로그
[JAVA] 변수 위치 및 메모리 구조 본문
1. Java 메모리 구조 개요
자바의 메모리 구조는 크게 Method Area, Heap, Stack, PC Register, Native Method Stack으로 나눌 수 있다. 각 영역은 특정한 데이터를 저장하고 관리하는 역할을 한다.
자바 메모리 영역
- Method Area (메소드 영역): 클래스 정보, static 변수, 상수 등을 저장합니다. 모든 클래스는 이 영역에 로드된다.
- Heap (힙 영역): 객체 인스턴스를 저장합니다. 객체가 생성될 때 힙 영역에 할당되고, 객체가 더 이상 참조되지 않으면 Garbage Collector(GC)가 이를 정리한다.
- Stack (스택 영역): 메서드 호출 스택, 지역 변수, 매개변수 등을 저장한다. 메서드 호출 시 스택 프레임을 쌓고, 메서드가 종료되면 해당 프레임을 제거한다.
- PC Register (PC 레지스터): 현재 실행 중인 명령어의 주소를 저장한다. 스레드마다 별도로 관리된다.
- Native Method Stack: 자바 외부 메서드(C언어 등) 호출 정보를 저장한다.
2. 자바 변수 위치 요약
| 구분 | 위치 | 초기화여부 | 설명 |
| 인스턴스 변수 | Heap 영역 | O (자동 초기화) | 객체 생성 시 저장되는 변수 |
| 클래스 변수 (static) | Method Area (Static 영역) | O (자동 초기화) | 클래스 로딩 시 딱 1번 생성 |
| 매개변수 | Stack 영역 | X (초기화 안 함) | 메소드 호출 시 전달받는 값 |
| 지역 변수 | Stack 영역 | X (초기화 안 함) | 메소드 안에서 선언된 변수 |
인스턴스 변수 (non-static 변수)
- 위치: Heap 영역
- 초기화 여부: 자동 초기화
- 설명: 인스턴스 변수는 객체가 생성될 때 힙 메모리에 할당된다. 이 변수는 객체마다 독립적으로 존재하며, 객체가 소멸되면 함께 소멸한다.
class Person {
String name; // 인스턴스 변수
}
Person p = new Person();
p.name = "홍길동"; // p 객체에 할당된 name 변수
클래스 변수 (static 변수)
- 위치: Method Area (Static 영역)
- 초기화 여부: 자동 초기화
- 설명: 클래스 변수는 클래스가 로딩될 때 딱 한 번 메모리에 할당된다. 객체가 없어도 접근 가능하며, 클래스의 모든 객체가 동일한 값을 공유한다.
class Counter {
static int count = 0; // 클래스 변수
public static void increment() {
count++;
}
}
Counter.increment(); // 클래스 변수 count에 접근
매개변수
- 위치: Stack 영역
- 초기화 여부: 초기화하지 않음
- 설명: 메서드 호출 시 전달되는 값으로, 메서드의 매개변수는 메서드가 호출될 때 스택에 저장된다. 매개변수는 메서드가 종료되면 소멸한다.
class Example {
void printName(String name) { // name은 매개변수
System.out.println(name);
}
}
지역 변수
- 위치: Stack 영역
- 초기화 여부: 초기화하지 않음
- 설명: 지역 변수는 메서드 내부에서 선언된 변수로, 메서드가 호출될 때 스택에 저장된다. 메서드가 종료되면 지역 변수는 사라진다.
class Example {
void method() {
int localVar = 10; // 지역 변수
System.out.println(localVar);
}
}
3. 객체 생성 과정
Test t = new Test();와 같이 객체를 생성하는 과정을 살펴보면
- Stack에 t라는 참조 변수가 생성됩니다. t는 Test 객체의 주소를 저장할 공간이다.
- Heap에 Test 객체가 생성됩니다. 이 객체는 인스턴스 변수와 데이터를 저장한다.
- Heap에 할당된 인스턴스 변수는 기본값으로 자동 초기화된다.
- t 변수는 Test 객체가 저장된 Heap 영역의 주소를 가리킨다.
class Test {
int value; // 인스턴스 변수
}
Test t = new Test(); // t는 Stack, 객체는 Heap에 생성됨
객체 생성 시 메모리 구조
Stack Heap Method Area
------- --------- --------------
t ------------> Test 인스턴스 Test 클래스 정보 (static 변수 등)
- Stack: 참조 변수 t
- Heap: Test 객체 (인스턴스 변수)
- Method Area: 클래스 정보 (static 변수 등)
4. Static과 Instance의 차이
자바에서 static과 인스턴스 변수는 메모리 위치와 접근 방식에서 큰 차이를 보인다. static 변수와 메서드는 클래스에 소속되며, 객체 없이도 접근 가능하다. 반면, 인스턴스 변수와 메서드는 객체에 소속되어야만 접근할 수 있다.
Static 변수/메서드 접근 예시
class Example {
static int staticVar = 10; // 클래스 변수
int instanceVar = 20; // 인스턴스 변수
static void staticMethod() {
System.out.println(staticVar); // static 변수에 접근
// System.out.println(instanceVar); // Error! (인스턴스 변수는 객체가 필요)
}
void instanceMethod() {
System.out.println(staticVar); // static 변수에 접근
System.out.println(instanceVar); // 인스턴스 변수에 접근
}
}
'Language > Java' 카테고리의 다른 글
| [JAVA] SOLID 원칙 (0) | 2025.05.04 |
|---|---|
| [JAVA] 상속 (0) | 2025.05.04 |
| [JAVA] 클래스 (0) | 2025.05.04 |
| [JAVA] JVM (0) | 2025.05.04 |
| 점프 투 자바 메모 (0) | 2023.08.09 |