초기화하지 않은 채 선언된 final 변수를 빈 final 변수(blank final variable)라고 합니다.
빈 final 변수와 컴파일 오류
일반적으로 인스턴스 변수는 생성자에서 초기화하며, 초기화를 생략하면 JVM이 기본값으로 자동 초기화해 줍니다. 하지만 빈 final 변수는 기본값으로 자동 초기화되지 않습니다. 따라서 생성자에서 초기화하지 않은 빈 final 변수를 사용하려고 하면 컴파일 타임 오류가 발생합니다.
오류 발생 예제
public class Student {
public final String name;
public void display() {
System.out.println("Name of the Student: "+this.name);
}
public static void main(String args[]) {
new Student().display();
}
}컴파일 오류 메시지
위 프로그램을 컴파일하면 다음과 같은 오류가 출력됩니다.
Student.java:3: error: variable name not initialized in the default constructor
private final String name;
^
1 error따라서 final 변수는 한 번이라도 반드시 초기화해야 합니다. 특히 클래스에 여러 개의 생성자가 정의되어 있다면, 어떤 생성자로 객체가 생성되더라도 값이 할당될 수 있도록 모든 생성자에서 빈 final 변수를 초기화해 주어야 합니다.
올바른 구현 예제
아래 예제는 기본 생성자와 매개변수가 있는 생성자 두 곳 모두에서 final 변수를 초기화하는 방법을 보여줍니다.
public class Student {
public final String name;
// 기본 생성자
public Student() {
this.name = "Raju";
}
// 매개변수가 있는 생성자
public Student(String name) {
this.name = name;
}
public void display() {
System.out.println("Name of the Student: "+this.name);
}
public static void main(String args[]) {
new Student().display();
new Student("Radha").display();
}
}실행 결과
Name of the Student: Raju Name of the Student: Radha
이처럼 모든 생성자 경로에서 final 변수가 확실하게 초기화되면, 해당 변수는 불변(immutable) 값을 안전하게 유지할 수 있습니다.