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

자바에서 생성자로 static final 변수를 초기화할 수 없는 이유

변수를 staticfinal로 함께 선언하면, 반드시 선언 시점 또는 static 블록 안에서 초기화해야 합니다.

그렇다면 생성자에서는 왜 초기화할 수 없을까요? 그 이유는 static final 변수가 특정 객체가 아니라 클래스 자체에 속하는 변수이기 때문입니다. 생성자는 인스턴스가 생성될 때마다 호출되므로, 생성자에서의 초기화를 허용하면 객체를 만들 때마다 상숫값이 달라질 위험이 있습니다. 따라서 컴파일러는 이러한 코드를 final 변수에 대한 재할당 시도로 판단하고 컴파일 타임 오류를 발생시킵니다.

오류가 발생하는 예제

class Data {
    static final int num;
    Data(int i) {
        num = i;
    }
}
public class ConstantsExample {
    public static void main(String args[]) {
        System.out.println("상수 값: " + Data.num);
    }
}

컴파일 타임 오류

ConstantsExample.java:4: error: cannot assign a value to final variable num
    num = i;
   ^
1 error

이 프로그램이 정상적으로 동작하도록 만들려면, 아래와 같이 static 블록에서 static final 변수를 초기화해야 합니다. static 블록은 클래스가 메모리에 로드될 때 단 한 번만 실행되기 때문에, 상수를 딱 한 번 초기화한다는 final의 의미와 정확히 일치합니다.

올바른 예제

class Data {
    static final int num;
    static {
        num = 1000;
    }
}
public class ConstantsExample {
    public static void main(String args[]) {
        System.out.println("상수 값: " + Data.num);
    }
}

실행 결과

상수 값: 1000

정리

  • static final 변수는 클래스 레벨의 상수이며, 클래스 로딩 시점에 단 한 번 초기화되어야 합니다.
  • 생성자는 인스턴스마다 여러 번 호출될 수 있으므로 초기화 위치로 적합하지 않습니다.
  • 초기화는 변수 선언 시 또는 static 블록에서 수행하는 것이 자바의 규칙입니다.