자바(Java)의 메모리 영역은 프로그램이 실행될 때 JVM(Java Virtual Machine)이 메모리를 어떻게 나눠서 쓰는지에 대한 개념이다.
자바는 JVM 위에서 동작하기 때문에, JVM이 운영체제로부터 메모리를 할당받아 다시 세부적으로 나눠서 관리한다. 크게 나누면 5가지 주요 영역이 있다👇
👉 ex) static int count = 0;
이런 정적 변수는 여기 들어감.
👉 ex) new String("hello"), new int[10]
👉 ex)
void test() {
int x = 10; // 스택에 저장됨
}
자바 프로그램을 실행하면 JVM이 아래 순서대로 메모리를 세팅한다 👇
.class
파일을 읽어서 메서드 영역(Method Area, Java 8 이후는 Metaspace) 에 클래스 정보를 적재👉 클래스 이름, 메서드, static 변수, 상수 등이 로딩됨
static
변수와 static
메서드가 먼저 준비됨👉 아직 객체를 만들지 않아도 클래스명.변수명
으로 접근 가능
main()
메서드 호출 시, main
스레드의 스택 프레임이 생김new
키워드로 객체 생성 시, 힙 영역에 메모리가 할당됨class Counter {
static int count = 0; // static 변수
int id; // 인스턴스 변수
Counter(int id) {
this.id = id;
count++;
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter(1);
Counter c2 = new Counter(2);
System.out.println(Counter.count);
}
}
✏️ 실행 과정
Counter.class
로딩 → 메서드 영역(Method Area)에 count
변수 준비됨 (0으로 초기화).
main()
실행 → 스택에 args
와 main()
스택 프레임 생성.
new Counter(1)
→ 힙에 객체 c1 생성, id=1
.
new Counter(2)
→ 힙에 또 다른 객체 c2 생성, id=2
.count++
실행 → count=2
.System.out.println(Counter.count)
→ 2 출력.👉 즉, static은 "클래스 차원에서 미리 준비" / 인스턴스는 "객체 만들 때 준비" 라고 이해하면 된다!