
// 변수 선언
// 지역변수는 선언만으로 메모리에 할당되지 않는다.
int age;
String name;
// 변수 초기화
age = 29;
// 선언과 동시에 초기화
int age = 29;
// 지역 변수를 선언 후 초기화가 되지 않은 경우에는 에러가 발생한다.
// System.out.println(name);
변수를 사용하기 위해서는 먼저 변수를 선언해야 한다.
변수의 선언은 어떤 타입의 데이터를 저장할 것인지 그리고 변수의 이름이 무엇인지 기술해야 한다.
변수의 종류마다 메모리에 할당되는 생성 시점이 다르다.
| 구분 | 위치 | 메모리 생성 시점 |
|---|---|---|
| 지역변수 | 메서드/블록 안 | 실행 시 |
| 매개변수 | 메서드 | 호출 시 |
| 인스턴스 변수 | 클래스 내부 | 객체 생성 시 |
| 클래스 변수(static) | 클래스 내부 | 클래스 로딩 시 |

자바 프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받고
JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
Stack 영역
메서드가 호출될 때마다 Stack Frame이 생성되어 실행 정보를 저장하는 공간이다.
각 Stack Frame에는 지역변수, 매개변수, 연산 중간값, 반환 주소 등이 저장된다.
메서드 실행이 종료되면 해당 Stack Frame은 자동으로 제거되며 이와 함께 내부에 저장된 지역변수와 매개변수도 함께 소멸된다. (개발자가 직접 메모리 해제 안 함)
Stack 영역은 LIFO(Last In First Out) 구조로 동작하며 가장 마지막에 호출된 메서드가 가장 먼저 종료된다.
스레드마다 독립적으로 생성되기 때문에 지역변수는 다른 스레드와 공유되지 않는다.
Heap 영역
new 키워드를 통해 생성된 객체와 배열이 저장되는 공간이다.Heap 영역에 저장되며Heap 영역에 생성된 객체는 메서드가 종료되더라도 바로 제거되지 않으며 더 이상 참조되지 않을 때 Garbage Collector(GC)에 의해 자동으로 해제된다.Method / Static 영역
static 멤버들이 저장되는 공간이다.JVM에 로딩될 때 생성되며, 프로그램 종료 시까지 유지된다.클래스 메타데이터, 메서드 바이트코드, static 변수, 상수 풀(Constant Pool)Method 영역은 모든 스레드에서 공유되며, 한 번 로딩된 클래스 정보는 재사용된다.자바에는 “상수 풀”이 두 개 있습니다.
| 구분 | 이름 | 위치 | 내용 |
|---|---|---|---|
| ① | Class Constant Pool | Method 영역(Metaspace) | 클래스 메타정보용 상수 |
| ② | Runtime String Pool | Heap | 문자열 리터럴 사용 시 할당 |
②. String Pool 은 다음 글(설명)에서 정리되어 있다.