자바 변수의 분류 기준 : 메모리 위치와 생명주기
자바에서 변수의 종류를 나눌 때 가장 중요한 기준은 '어디에 저장되고', '언제 생성되며', '언제 사라지는가' 이다. 이는 곧 JVM의 메모리 영역과 직결된다.
| 변수 종류 | 메모리 영역 | 생명주기 |
| 지역 변수 (Local Variable) | 스택 영역 | 메서드가 호출될 때 생성되어, 메서드가 종료될 때 소멸 |
| 멤버 변수 (Instance Variable) | 힙 영역 | 객체가 생성될 때 생성되어, 객체가 GC될 때 소멸 |
| 클래스 변수/정적 변수 (Static Variable) | 메서드 영역 | 클래스가 로딩될 때 생성되어, JVM이 종료될 때까지 유지 |
| 전역 변수 | 없음 | 상황에 따라 클래스 변수 또는 멤버 변수로 구현 |
핵심 변수 3가지 상세 분석
1) 지역 변수 (Local Variable)
- 선언 위치 : 메서드 내부, 생성자 내부, 또는 제어문 내부
- 메모리 위치 : 스택 영역에 저장
- 생명 주기 : 해당 메서드나 블록이 호출될 때 생성되고, 실행이 종료될 때 스택에서 pop 되며 소멸
- 접근 범위 : 선언된 메서드나 블록 내부에서만 사용 가능
- 초기화 : 반드시 수동으로 초기화 해야 함 (초기화 하지 않으면 컴파일 오류 발생)
예시
public void calculate() {
int num1 = 10; // 지역 변수 (Stack에 저장)
// ...
} // 메서드 종료 시 num1 소멸
2) 멤버 변수 (Instance Variable)
- 선언 위치 : 클래스 내부에 선언되며 `static` 키워드가 붙지 않는다.
- 메모리 위치 : 힙 영역에 저장
- 생명 주기 : 객체 (`new`)가 생성될 때 생성되어, 객체가 가비지 컬렉터(GC에 의해 제거될 때 소멸된다.
- 접근 범위 : 클래스 내부 어디서든 접근 가능하며, 객체를 통해 외부에서도 접근 가능
- 초기화 : 자동으로 기본값으로 초기화됨
예시
public class User {
private String name; // 멤버 변수 (Heap에 저장)
public void setName(String name) {
this.name = name;
}
}
// 사용: User user1 = new User();
// -> user1 객체와 name이 Heap에 생성됨
3) 클래스 변수/정적 변수 (Static Variable)
- 선언 위치 : 클래스 내부에 선언되며, `static` 키워드가 붙는다.
- 메모리 위치 : 메서드 영역에 저장
- 생명 주기 : 클래스가 JVM에 로딩될 때 생성되어, JVM이 종료될 때까지 살아있음 (가장 긴 생명주기)
- 접근 범위 : 클래스 이름으로 접근 가능하며, 모든 객체가 이 값을 공유함
- 초기화 : 멤버 변수와 동일하게 자동으로 기본값으로 초기화됨
예시
public class Config {
// 모든 객체가 공유하는 변수
public static final String VERSION = "1.0";
// static 변수는 객체 생성 없이 바로 접근 가능
}
// 사용: System.out.println(Config.VERSION);
전역변수 ?
자바 언어 스택에서는 전역 변수 (Global Variable) 라는 개념이 명시적으로 존재하지 않는다.
-> 자바는 캡슐화와 객체 지향을 위해 클래스 외부의 전역 변수를 허용하지 않는다. 전역적으로 사용되는 데이터는 다음 2가지로 대체된다.
1) 클래스 변수 : `public static final` 형태로 선언하여 전체 애플리케이션에 공유 설정값, 상수 등을 만든다.
2) 싱글톤 객체 : 데이터 저장소나 유틸리티처럼 프로그램 전반에 걸쳐 사용되는 객체를 싱글톤 패턴으로 구현하여 사용한다.
'Java' 카테고리의 다른 글
| [Java] JVM GC 작동 원리 (0) | 2025.11.10 |
|---|---|
| [Java] JVM(자바 가상 머신)에 대한 모든 것 (0) | 2025.11.10 |
| [Java] 원시타입(Primitive Type)과 참조타입(Reference Type) (0) | 2025.10.14 |
| [Java] 스트림(Stream)에 대하여 (0) | 2025.10.14 |
| [Java] 실수를 나타내는 Double, double, float, decimal 의 차이 (0) | 2025.10.13 |
