[Language] Java

[Language/Java] final클래스와 final메소드

itkw87 2024. 1. 6. 23:47

#.포스트 소개 (Post Introduction)

오늘은 final 클래스와 final 메소드에 대해 다뤄보려고 한다. 자바에서 필드 선언 시 final 예약어를 붙이면 초기값 설정 후 값을 변경할 수 없는 필드가 된다. 그런데 이 final 예약어는 필드 뿐만이 아니라 class와 메서드 선언시에도 붙여서 사용할 수 있다. 필자는 이 사실을 알게된지 얼마되지 않았다!... 그래서 오늘은 클래스와 메소드 선언시 각각 final을 붙여서 선언하면 어떤 효과가 있는지 알아보려고한다.

 

 

 


 

 

 

#.final 클래스

클래스를 선언할 때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더 이상 상속할 수 없는 클래스가 된다. 즉, final 클래스로 선언된 클래스는 부모 클래스가 될 수 없게되는 셈이다. 쉽게 말해 final 클래스를 상속받아 기능을 추가하거나 변경하는 것이 불가능 하다는 것이다. 

 

자바에서 fianl 클래스에 해당되는 대표적인 클래스들로는 String과 Math 클래스가 있다. 따라서, 클래스를 선언할 때  String 클래스나 Math 클래스를 상속받도록 선언할 수 없다. 아래 사진은 실제 필자가 직접 인텔리제이에서 각각 String 클래스와 Math클래스를 상속받는 Test 클래스를 선언하려고한 코드이다. 

final클래스인 String클래스를 상속 받으려고 하는 예시 코드

 

final클래스인 Math클래스를 상속 받으려고 하는 예시 코드

 

두 경우 모두 각각'final로 선언된 String 혹은 Math 클래스를 상속 받을 수 없다' 라는 컴파일 에러 경고 문구가 뜨는 것을 확인할 수 있다.

 

 

 

#.final 메소드

final 메소드는 메소드 선언부에 final 예약어가 붙은 메소드를 의미 한다. 메소드 선언부에 final 예약어가 붙게 되면 영어 단어 의미 그대로 '최종적' 이라는 의미를 갖는 메소드 가 된다.

 

쉽게 설명하면 어떤 클래스가 부모 클래스를 상속 받아 자식 클래스를 생성하려고 할 때, 부모 클래스에 final 키워드가 붙은 메소드는 자식 클래스에서 재정의(Override)할 수 없게 되는 것 이다. 이렇게 되면, 해당 메소드의 기능이 변조되는 것을 방지 할 수 있다.

 

아래의 코드는 final 메소드와 관련한 자바 예시코드이다.

public class ParentClass {
    public final void finalMethod() {
        System.out.println("안녕? 나는 final 메소드야");
    }
}

public class ChildClass extends ParentClass {
    // 오류 발생! 
    public void finalMethod() {
        System.out.println("오버라이딩 시도");
    }
}

위 코드에서 'finalMethod' 메소드는 'final' 키워드가 붙어 있어 오버라이딩이 불가능하다. 따라서, 'ChildClass'에서 'finalMethod ' 메소드를 오버라이딩하려고 하면 컴파일 오류가 발생하게 된다!

 

 

 


 

 

 

#.요약 및 정리(Summary)

finalClass와 finalMethod

지금까지 설명한 final 클래스와 final 메소드의 차이점을 필자가 그린 위의 그림으로 쉽게 정리할 수 있다. 핵심만 다시 글로 각각 정리하자면 'final Class는 부모 클래스가 될 수 없다' 라는 점과 'final 메소드는 재정의(Overrid) 될 수 없다' 는 점이다.