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

자바에서 생성자를 final로 선언할 수 없는 이유

자바에서 메서드에 final 키워드를 붙이면 해당 메서드를 오버라이드(재정의)할 수 없습니다. 즉, 하위 클래스에서 상위 클래스의 final 메서드를 다시 구현하는 것이 금지됩니다.

final의 본질적인 목적은 외부, 특히 자식 클래스로부터 메서드의 동작이 변경되는 것을 방지하는 데 있습니다.

생성자는 상속되지 않는다

상속 관계에서 하위 클래스가 상위 클래스를 확장(extends)하면, 하위 클래스는 상위 클래스의 모든 멤버를 물려받습니다. 단, 한 가지 예외가 있는데 바로 생성자입니다.

자바에서 생성자는 상속되지 않기 때문에, 하위 클래스가 상위 클래스의 생성자를 오버라이드하는 것 역시 불가능합니다.

결국 생성자 앞에 final을 붙이는 것은 아무런 의미가 없습니다. 오버라이드 자체가 일어날 수 없는데 수정을 막겠다는 것은 논리적으로 성립하지 않기 때문입니다. 그래서 자바 언어 명세는 생성자에 final 키워드의 사용을 아예 허용하지 않습니다.

만약 생성자에 final을 붙여 컴파일을 시도하면 다음과 같은 컴파일 타임 오류가 발생합니다.

"modifier final not allowed here"

예제 코드

아래 자바 프로그램에서 Student 클래스의 생성자에는 final 키워드가 붙어 있습니다.

public class Student {
    public final String name;
    public final int age;
    public final Student() {
        this.name = "Raju";
        this.age = 20;
    }
    public void display() {
        System.out.println("Name of the Student: "+this.name );
        System.out.println("Age of the Student: "+this.age );
    }
    public static void main(String args[]) {
        new Student().display();
    }
}

컴파일 타임 오류

위 프로그램을 컴파일하면 다음과 같은 오류 메시지가 출력됩니다.

Student.java:6: error: modifier final not allowed here
    public final Student(){
                ^
1 error

정리

  • final 메서드는 하위 클래스에서 오버라이드할 수 없습니다.
  • 생성자는 상속되지 않으므로 오버라이드 대상이 될 수 없습니다.
  • 따라서 생성자에 final을 붙이는 것은 무의미하며, 자바는 이를 문법적으로 금지합니다.