Java의 정적(Static) 변수란?
정적 변수는 static 키워드를 사용해 선언하는 변수로, 흔히 클래스 변수(class variable)라고도 부릅니다. 이 변수는 생성자 내부 또는 클래스 메서드 외부에 정의할 수 있으며, 한 번 선언되면 생성된 객체의 개수와 관계없이 해당 클래스의 모든 인스턴스가 하나의 값을 공유합니다.
변수에 static 키워드를 적용했을 때 실제로 어떻게 동작하는지 아래 예제를 통해 확인해 보겠습니다.
예제 코드
public class Demo{
String name;
static String designation;
public void display_data(){
System.out.println("The name is: " + name);
System.out.println("The designation of this team members is : " + designation);
}
public static void main(String s[]){
Demo.designation = "Intern";
Demo my_obj = new Demo();
my_obj.name = "Joe";
Demo my_obj_2 = new Demo();
my_obj_2.name = "Joanna";
my_obj.display_data();
my_obj_2.display_data();
my_obj.designation = "Senior dev";
System.out.println("\nAfter the changes, the data is :\n");
my_obj.display_data();
my_obj_2.display_data();
}
}
출력 결과
The name is: Joe The designation of this team members is : Intern The name is: Joanna The designation of this team members is : Intern After the changes, the data is : The name is: Joe The designation of this team members is : Senior dev The name is: Joanna The designation of this team members is : Senior dev
Demo 클래스에는 여러 변수와 함께 클래스 변수를 출력하는 display_data() 메서드가 정의되어 있습니다. main 메서드에서는 클래스의 인스턴스를 생성하고 각 객체마다 서로 다른 이름(name)을 할당한 뒤 정보를 출력합니다. 이후 한 객체를 통해 designation 값을 "Senior dev"로 변경하면, 두 번째 객체에서도 동일하게 변경된 값이 출력됩니다. 이처럼 static 변수는 모든 객체가 함께 공유하기 때문에 어느 한 곳에서 값을 바꾸면 전체에 반영된다는 점이 핵심입니다.
정적 빈 최종 변수(Static Final Blank Variable)
static final 빈 변수는 일반 빈 final 변수의 정의에 static 키워드가 결합된 형태입니다. 즉, 이 변수는 오직 static 블록(static block) 안에서만 초기화할 수 있습니다. 인스턴스 생성자가 아니라 클래스가 로딩될 때 딱 한 번 실행되는 static 초기화 블록에서 값을 할당해야 하며, 이를 지키지 않으면 컴파일 오류가 발생합니다.
빈 최종 변수(Blank Final Variable)란?
빈 final 변수는 말 그대로 아직 값이 할당되지 않은 final 변수를 의미합니다. final 변수이기 때문에 단 한 번만 초기화할 수 있으며, 이 초기화 작업은 생성자 내부에서만 가능합니다. 만약 빈 final 변수를 초기화하지 않고 프로그램을 작성하면 컴파일 에러가 발생합니다.
빈 final 변수의 실제 동작 방식을 예제로 살펴보겠습니다.
예제 코드
public class Demo{
private static final int val_1;
private final int val_2;
static{ val_1 = 1;
}
Demo(int val_3){
val_2 = val_3;
}
public static void main(String s[]){
Demo obj_1 = new Demo(95);
Demo obj_2 = new Demo(99);
System.out.println("The value of first variable is : ");
System.out.println(Demo.val_1);
System.out.println("The value of first variable accessed using the object : ");
System.out.println(obj_1.val_2);
}
}
출력 결과
The value of first variable is : 1 The value of first variable accessed using the object : 95
Demo 클래스에는 두 가지 종류의 빈 final 변수가 선언되어 있습니다. val_1은 static final 변수로 static 블록에서 1로 초기화되며, val_2는 인스턴스 final 변수로 생성자 Demo(int val_3)에서 전달받은 값으로 초기화됩니다. main 메서드에서는 두 개의 인스턴스를 서로 다른 값(95, 99)으로 생성한 후 각 변수의 값을 콘솔에 출력합니다. val_1은 모든 객체가 공유하는 단일 값인 반면, val_2는 객체마다 고유한 값을 가질 수 있다는 차이를 통해 static final 빈 변수와 일반 빈 final 변수의 초기화 규칙 차이를 명확히 이해할 수 있습니다.