본문 바로가기

Java/Java SE, EE

[Java/Java SE, EE] final 키워드

final 필드

자바의 final 키워드는 필드(변수) 또는 클래스, 메소드에 상수의-Immutable한 성격을 부여합니다. 가령 필드에 final 키워드를 붙이게 되면 해당 필드는 객체가 초기화되는 시점에서만 값이 부여되고, 더 이상 변경 할 수 없게 됩니다. final 키워드는 다음과 같이 사용합니다.

final [변수 타입] [변수명] = [초기 값];

클래스에서 final 필드를 선언할 때는 생성자에서 초기 값을 지정 할 수 있습니다. final 필드에 저장되는 값이 복잡한 계산으로 생성되거나, 또는 인스턴스가 생성되면서 부여해야 하는 경우 이 방법을 사용합니다. 이때 생성자에서 final 필드에 값을 지정하지 않으면, 컴파일러는 'Variable ... might not have been initialized' 에러를 일으킵니다.

public final class SomeClass {
   final int some_field;
   
   public SomeClass() {
      some_field = 20;
   }
}

final 클래스

final 키워드는 클래스의 선언에서도 사용 할 수 있습니다. final 키워드로 지정된 클래스는 다른 클래스로의 상속을 제한합니다. 예를 들어, 아래와 같은 코드는 컴파일러에서 'Cannot inherit from final A' 에러를 일으킵니다.

public final class A { }
public class B extends A { }

자바에서 대표적인 final 클래스는 String.class가 있습니다. 

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    (...)
}

그렇다면 final 클래스는 언제 사용될까요? final 키워드로 지정된 클래스는 상속을 제한하고, 그렇기 때문에 모든 메소드는 다른 클래스로부터 재정의(Override) 될 수 없습니다. 즉, 시스템에서 민감한 역할을 담당하는 클래스의 재정의로 인한 위험 요소를 배제하는 목적으로 사용합니다.

final 메소드

내가 작성한 클래스가 상속은 가능하게 하되, 특정 메소드에 대해서는 재정의(Override)를 방지하는 방법도 있습니다. 이를 위해 자바에서는 클래스의 메소드에 final 키워드를 지정 할 수 있습니다.

[접근 지정자] final [리턴 타입] [메소드 이름] ([파라미터], ...) { }