자바의 4가지 변수와 JVM에서의 저장위치
학습목표
지역변수, 매개변수, 인스턴스변수, Static변수가 각각 어떤 건지, 또 JVM 메모리에 각각 어디에 저장될까?
자바의 4가지 변수
public class VariableTypes {
**static** int 클래스변수;
int 인스턴스변수;
public void method(int 매개변수){
int 지역변수;
}
}
자바에는 총 4가지 변수가 있다.
| static변수(클래스변수) | 인스턴스변수 | |
|---|---|---|
| 객체 생성이 필요한가 | static 키워드가 붙고, 객체 없이도 사용할 수 있다. 클래스이름.클래스변수 를 통해 접근할 수 있다. |
객체를 생성 해야만 사용할 수 있다 |
| 저장공간 | 한 클래스의 모든 인스턴스가 공유하는 저장공간을 가지므로 공통적인 값을 가진다. | static변수와 달리, 독립적인 저장공간을 가지므로 인스턴스 별로 다른 값을 가질 수 있다. |
| 사용목적 | 주로 공유의 목적으로 사용된다. | 인스턴스마다 고유의 값을 가지게 할 때 인스턴스 변수를 사용한다. |
- static변수(클래스변수)
- static 키워드가 붙고, 특정 인스턴스가 아니라 클래스에 소속된다. 클래스는 메소드 영역에 먼저 올라간다. 즉, 객체가 생기기 전에 생성되기 때문에 객체 없이도 사용할 수 있다.
클래스이름.클래스변수를 통해 접근할 수 있다. 클래스 소속이기에 객체가 사라져도 사용 가능하다.- 클래스 하나당 하나만 생성된다.
- 객체 내부가 아니라, 한 클래스의 모든 인스턴스가 공유하는 별도의 공간에 생성되므로, 공통적인 값을 가진다. 주로 공유의 목적으로 사용된다.
- 인스턴스변수
- 객체를 생성 해야만 사용할 수 있다.
- 객체가 생성될 때 같이 생성된다. 즉 static변수와 달리, 독립적인 저장공간을 가지므로 인스턴스 별로 다른 값을 가질 수 있다. 인스턴스마다 고유의 값을 가지게 할 때 인스턴스 변수를 사용한다.
- 객체가 사라지면 사용 불가능하다.
- 파라미터(매개변수) : 메소드를 정의할 때 선언되는 변수. 메서드 호출 시 외부로부터 전달받는 값을 저장하는 데 사용된다.
- 지역변수(로컬변수) : 메소드 내에 선언되며 메소드 내에서만 사용할 수 있는 변수
생명주기에 따른 JVM에서의 저장 위치

| JVM 저장 위치 | 저장되는 변수 | 생명 시작 시점 | 소멸 시점 |
|---|---|---|---|
| 1. 메소드영역 | static 변수 | 클래스 생성될 때 생명 시작 (딱 한번만 메모리에 올라감) | 자바 프로그램이 끝나면 소멸 |
| 2. 힙 영역 | 인스턴스 변수 | 객체가 생성될 때 생명 시작 (객체의 일부이기 때문) | 그 객체를 참조하고 있는 다른 객체가 없으면 소멸(gc가 정리함) |
| 3. 스택 영역 (스택영역에는 메소드마다 스택 프레임이 만들어지는데 거기에 저장됨) |
파라미터 | 메소드 호출시 생명 시작 | 메소드 끝나면 스택프레임과 함께 소멸 (호출한 메소드에서 넘겨준 참조 자료형은 그대로 살아있음) |
| 지역변수 | 지역변수를 선언한 곳부터 생명 시작 | 메소드가 끝나면 스택프레임과 함께 소멸 (지역변수를 선언한 중괄호가 끝나면 소멸) |
댓글남기기