자바에서 변수를 올바르게 사용하려면 각 변수가 어디까지 접근 가능한지(범위, Scope)와 언제까지 메모리에 유지되는지(수명, Lifetime)를 정확히 이해해야 합니다. 자바의 변수는 선언된 위치와 방식에 따라 크게 세 가지로 나뉩니다.
1. 인스턴스 변수 (Instance Variables)
클래스 내부에 선언되지만 모든 메서드와 블록 바깥에 위치하는 변수를 인스턴스 변수라고 합니다.
- 범위: static 메서드를 제외한 클래스 전체에서 접근할 수 있습니다.
- 수명: 해당 객체가 메모리에 존재하는 동안 유지됩니다. 즉, 객체가 생성될 때 함께 만들어지고 가비지 컬렉터(GC)가 객체를 회수할 때 소멸합니다.
2. 클래스 변수 (Class Variables)
클래스 내부에 선언되고 모든 블록 바깥에 위치하며, static 키워드가 붙은 변수를 클래스 변수라고 합니다.
- 범위: 클래스 전체에서 접근 가능하며, 객체를 생성하지 않고도
클래스명.변수명형태로 사용할 수 있습니다. - 수명: 프로그램이 종료되거나 해당 클래스가 메모리에서 언로드될 때까지 유지됩니다. 모든 인스턴스가 이 변수를 공유한다는 점이 특징입니다.
3. 지역 변수 (Local Variables)
인스턴스 변수와 클래스 변수에 해당하지 않는 나머지 모든 변수는 지역 변수로 분류됩니다. 여기에는 메서드의 매개변수(parameter)도 포함됩니다.
- 범위: 변수가 선언된 블록({ }) 내부에서만 유효합니다.
- 수명: 실행 흐름(제어)이 해당 블록을 벗어나는 순간 소멸합니다.
지역 변수는 반드시 사용 전에 초기화해야 하며, 초기화하지 않으면 컴파일 오류가 발생한다는 점도 기억해 두는 것이 좋습니다.
세 가지 변수 비교 요약
| 구분 | 선언 위치 | 범위 | 수명 |
|---|---|---|---|
| 인스턴스 변수 | 클래스 내부, 메서드 외부 | static 메서드 제외 클래스 전체 | 객체가 메모리에 있는 동안 |
| 클래스 변수 | 클래스 내부 + static 키워드 | 클래스 전체 | 프로그램 종료 또는 클래스 언로드 시까지 |
| 지역 변수 | 메서드·블록·생성자 내부 | 선언된 블록 내부 | 블록 실행이 끝날 때까지 |
변수의 범위와 수명을 정확히 구분하면 불필요한 메모리 낭비를 줄이고, 의도치 않은 값 공유로 인한 버그를 예방할 수 있습니다. 상황에 맞는 변수 유형을 선택하는 습관이 깔끔하고 안정적인 자바 코드 작성의 첫걸음입니다.