자바 메모리 구조
JVM은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라 크게 3가지 영역으로 나누어 관리한다.
Method(Static) 영역, Stack 영역, Heap 영역으로 구분되며, 데이터 타입에 따라 각 영역에 나눠서 할당된다.

자바 변수 종류
public class VariableExample {
// 2. 인스턴스 변수
int instanceCount = 10;
// 3. 클래스 변수 (static 변수)
static int totalCount = 100;
// 4. 매개변수(parameter) 사용
public void printValues(String name) {
// 1. 지역 변수
int localValue = 5;
System.out.println("이름: " + name); // 매개변수
System.out.println("지역 변수: " + localValue); // 지역 변수
System.out.println("인스턴스 변수: " + instanceCount);
System.out.println("클래스 변수: " + totalCount);
}
public static void main(String[] args) {
VariableExample obj = new VariableExample();
obj.printValues("동호");
}
}
| 변수명 | 선언위치 | 설명 |
| 클래스 변수 | 클래스 영역 | 클래스 영역에서 타입 앞에 static이 붙는 변수 객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의 static을 미리 붙이면, 코드보다 먼저 실행 |
| 인스턴스 변수 | 클래스 영역에서 static이 아닌 변수 개별적인 저장 공간으로 객체/인스턴스마다 다른 값 저장 가능 |
|
| 지역 변수 | 메서드 영역 | 메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수 초깃값을 지정한 후 사용할 수 있음 |
| 매개 변수 | 메서드 호출 시 전달하는 값을 가지고 있는 인수 지역 변수처럼 선언된 곳부터 수행이 끝날 때까지 유효함 |
각 변수의 생성 시기
- 클래스 변수는 클래스가 메모리에 올라갈 때
- 인스턴스 변수는 인스턴스가 생성되었을 때
- 지역 변수와 매개 변수는 위치하고 있는 메서드가 수행되었을 때
Method(Static) 영역
JVM이 동작해서 클래스가 로딩될 때, 생성되는 영역으로 클래스와 인터페이스에 대한 상수(리터럴 풀), 멤버 변수(필드), 클래스 변수(Static 변수), 상수(final), 생성자(Constructor)와 메서드(Method) 등을 저장하는 공간이다.
public class MethodAreaExample {
// 메서드 영역에 저장되는 static 변수
static int staticCount = 100;
// 메서드 영역에 저장되는 static 메서드
public static void printStatic() {
System.out.println("staticCount = " + staticCount);
}
public static void main(String[] args) {
// 문자열 리터럴도 메서드 영역의 String Constant Pool에 저장됨
String msg = "Hello";
printStatic();
}
}
Stack 영역
원시타입(int, double, byte, long, boolean 등)에 해당하는 지역 변수, 매개 변수, 참조 변수 저장된다.
메서드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터값이 저장되는 공간이다.
메서드가 호출될 때 메모리에 할당되고 메서드가 종료되면 메모리에서 제거된다.
Stack은 후입선출(LIFO; Last - In - First - Out)의 특성을 가지며, 스코프 범위를 벗어나면 스택 메모리에서 사라진다.
public class StackAreaExample {
public void calculate(int x) { // x = 매개변수 → 스택
int y = 10; // 지역변수 → 스택
int result = x + y; // 지역변수 → 스택
System.out.println(result);
}
public static void main(String[] args) {
StackAreaExample obj = new StackAreaExample(); // obj는 참조 변수 → 스택
obj.calculate(5);
}
}
new StackAreaExample()은 힙 영역에서 생성된다.
Stack Frame
메서드 호출될 때 스택 영역에 스택 프레임이 생기고 그 안에 메서드를 호출하게 되는데,
여기서 스택 프레임은 프로그램 실행 중 함수가 호출될 때 스택 메모리 영역에 생성되는 그 함수만을 위한 독립적인 메모리 공간이다. 함수가 종료되면 해당 스택 프레임은 스택에서 제거되고 메모리에서도 제거된다.
독립적인 메모리 공간을 사용하여, 서로의 데이터에 영향을 주지 않는다.
| 스택 프레임 | result |
| int y | |
| int x |
Heap 영역
JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
Heap 영역은 new 연산으로 생성되는 객체(인스턴스)와 배열 등이 저장되는 공간으로, 여기에 생성된 데이터는 동적으로 관리되며 GC의 대상이 된다. 하지만, 이 객체를 가리키는 참조 변수는 Stack 영역에 저장된다.
public class HeapAreaExample {
// 인스턴스 변수 → 객체가 만들어질 때 힙에 저장
int value = 42;
public static void main(String[] args) {
// new로 만든 객체 → 힙에 생성
HeapAreaExample obj = new HeapAreaExample();
// 배열도 힙에 저장
int[] numbers = new int[3];
numbers[0] = 1; // 힙에 있는 배열에 값 저장
numbers[1] = 2;
numbers[2] = 3;
System.out.println(obj.value);
}
}
면접 답변식 요약
JVM이 OS로부터 받은 메모리는 Method Area(Static), Stack, Heap 세 영역으로 나뉩니다.
Static(Method) 영역은 클래스와 인터페이스에 대한 필드를 저장하는 공간입니다.
Stack 영역은 원시 타입인 매개 변수, 지역 변수 데이터 값이 저장되는 영역이며, 후입선출의 특성을 가집니다.
메서드가 호출될 때 메모리에 할당되고 메서드가 종료되면 메모리에서 제거됩니다.
Heap 영역은 프로그램을 실행 시 동적으로 할당하여 사용하는 영역으로, new 연산을 통해 생성된 객체와 배열 등이 저장되는 공간이다. 여기서 생성된 데이터는 동적으로 관리되며 GC의 대상이 됩니다.
'Daily Dev Q&A 정리 템플릿' 카테고리의 다른 글
| 25.12.01 객체지향 언어 개념과 자바는 어떤 언어인가 (0) | 2025.12.01 |
|---|---|
| 25.11.28 자바의 예외 처리(Exception)에 대하여 (0) | 2025.11.30 |
| 25.11.28 자바는 컴파일러일까? 인터프리터일까? (0) | 2025.11.28 |
| 25.11.25 JAVA의 GC(Garbage Collection) (0) | 2025.11.25 |
| 25.11.24 JVM이란? (0) | 2025.11.24 |