Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java의 static 변수와 빈(blank) final 변수, 정확한 차이와 사용법

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 변수의 초기화 규칙 차이를 명확히 이해할 수 있습니다.