Java에서 클래스 변수(class variable)는 정적 변수(static variable)라고도 불리며, static 키워드를 사용하여 메서드 외부, 즉 클래스 레벨에 선언됩니다.
정적 변수는 해당 클래스의 모든 인스턴스가 공유하는 변수입니다. 변수의 복사본은 단 하나만 존재하며, 생성된 모든 객체가 이 하나의 값을 함께 사용하게 됩니다.
정적 변수의 주요 특징
- 클래스가 로딩될 때 메모리에 한 번만 할당됩니다.
- 객체를 생성하지 않고도
클래스명.변수명형태로 접근할 수 있습니다. - 모든 인스턴스가 값을 공유하므로, 한 객체에서 값을 변경하면 다른 객체에도 그 변경 사항이 그대로 반영됩니다.
예제 코드
public class Demo{
static int my_count = 2;
public void increment(){
my_count++;
}
public static void main(String args[]){
Demo obj_1 = new Demo();
Demo obj_2 = new Demo();
obj_1.increment();
obj_2.increment();
System.out.println("첫 번째 객체의 카운트: " + obj_1.my_count);
System.out.println("두 번째 객체의 카운트: " + obj_2.my_count);
}
}실행 결과
첫 번째 객체의 카운트: 4
두 번째 객체의 카운트: 4
코드 설명
Demo 클래스는 정적 변수 my_count를 선언하고, 이 변수의 값을 1씩 증가시키는 increment() 메서드를 정의합니다. main 메서드에서는 클래스의 인스턴스 두 개(obj_1, obj_2)를 생성한 뒤, 각 객체에 대해 increment() 메서드를 호출하고 결과를 화면에 출력합니다.
동작 순서
- 정적 변수
my_count가 초기값 2로 설정됩니다. obj_1.increment()호출 시 값이 1 증가하여 3이 됩니다.obj_2.increment()호출 시 값이 다시 1 증가하여 4가 됩니다.- 두 객체가 출력하는 값은 모두 4로 동일합니다.
출력 결과에서 알 수 있듯이, 서로 다른 객체임에도 불구하고 두 객체가 참조하는 my_count 값은 같습니다. 이는 정적 변수가 객체별로 따로 존재하는 것이 아니라 클래스 차원에서 하나만 존재하며 모든 객체가 공유하기 때문입니다.
마무리
정적 변수는 인스턴스 개수와 무관하게 공통 상태를 유지해야 할 때 유용하게 사용됩니다. 대표적으로 객체 생성 횟수 카운팅, 전역 설정값 저장 등에 활용되며, 여러 스레드가 동시에 접근할 경우 값이 공유된다는 점을 항상 염두에 두어야 합니다.