Java final 키워드 마스터: 변수, 메서드, 클래스에서의 활용
Java final 키워드
Java의 final 키워드가 상수 보호, 메서드 오버라이딩 방지, 클래스 상속 차단을 어떻게 구현하는지 명확한 예제로 알아봅니다.
Java에서 final 키워드는 변수, 메서드, 클래스 등 엔티티가 최초 정의 이후 변경될 수 없음을 나타냅니다. 이 불변 계약은 컴파일 타임에 강제되어 개발자에게 프로그램 동작에 대한 보장을 제공합니다.
- Final 변수는 재할당 불가
- Final 메서드는 하위 클래스에서 오버라이딩 불가
- Final 클래스는 확장 불가
1. Final 변수
변수를 final로 선언하면 최초 할당 후 값이 고정됩니다. 이는 Java에서 상수를 정의하는 표준 방식입니다.
class Main { public static void main(String[] args) { // final 변수 선언 final int AGE = 32; // 다음 라인은 컴파일 에러 발생 // AGE = 45; System.out.println("Age: " + AGE); } }
컴파일러는 AGE 재할당을 시도하는 코드를 컴파일하지 않으며, 다음과 유사한 에러를 냅니다:
cannot assign a value to final variable AGE AGE = 45; ^
팁: 관례상 상수 이름은 모두 대문자와 언더스코어(예: MAX_SIZE)로 작성하여 불변성을 나타냅니다.
2. Final 메서드
Final 메서드는 Java 상속 안전망의 일부입니다. 메서드가 final로 표시되면 하위 클래스에서 오버라이딩할 수 없어 원래 구현이 보존됩니다.
class FinalDemo { // Final 메서드 public final void display() { System.out.println("This is a final method."); } } class Main extends FinalDemo { // 오버라이딩 시도 – 컴파일 에러 발생 public final void display() { System.out.println("The final method is overridden."); } public static void main(String[] args) { Main obj = new Main(); obj.display(); } }
display() 메서드 오버라이딩 시 다음과 같은 에러가 발생합니다:
display() in Main cannot override display() in FinalDemo public final void display() { ^ overridden method is final
3. Final 클래스
final 클래스는 하위 클래스로 만들 수 없습니다. 이는 보안이 중요하거나 불변인 타입에 자주 사용되어 클래스 동작이 변경되지 않게 합니다.
// Final 클래스 정의 final class FinalClass { public void display() { System.out.println("This is a final class."); } } // Final 클래스 확장 시도 class Main extends FinalClass { public void display() { System.out.println("The final class is overridden."); } public static void main(String[] args) { Main obj = new Main(); obj.display(); } }
컴파일러는 이 상속을 다음과 같이 거부합니다:
cannot inherit from final FinalClass class Main extends FinalClass { ^