#.포스트 소개 (Post Introduction)
오늘은 final 클래스와 final 메소드에 대해 다뤄보려고 한다. 자바에서 필드 선언 시 final 예약어를 붙이면 초기값 설정 후 값을 변경할 수 없는 필드가 된다. 그런데 이 final 예약어는 필드 뿐만이 아니라 class와 메서드 선언시에도 붙여서 사용할 수 있다. 필자는 이 사실을 알게된지 얼마되지 않았다!... 그래서 오늘은 클래스와 메소드 선언시 각각 final을 붙여서 선언하면 어떤 효과가 있는지 알아보려고한다.
#.final 클래스
클래스를 선언할 때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더 이상 상속할 수 없는 클래스가 된다. 즉, final 클래스로 선언된 클래스는 부모 클래스가 될 수 없게되는 셈이다. 쉽게 말해 final 클래스를 상속받아 기능을 추가하거나 변경하는 것이 불가능 하다는 것이다.
자바에서 fianl 클래스에 해당되는 대표적인 클래스들로는 String과 Math 클래스가 있다. 따라서, 클래스를 선언할 때 String 클래스나 Math 클래스를 상속받도록 선언할 수 없다. 아래 사진은 실제 필자가 직접 인텔리제이에서 각각 String 클래스와 Math클래스를 상속받는 Test 클래스를 선언하려고한 코드이다.
두 경우 모두 각각'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)
지금까지 설명한 final 클래스와 final 메소드의 차이점을 필자가 그린 위의 그림으로 쉽게 정리할 수 있다. 핵심만 다시 글로 각각 정리하자면 'final Class는 부모 클래스가 될 수 없다' 라는 점과 'final 메소드는 재정의(Overrid) 될 수 없다' 는 점이다.
'[Language] Java' 카테고리의 다른 글
[Language/Java] 봉인된 클래스 (Sealed Class) (38) | 2024.01.10 |
---|---|
[Language/Java] 싱글톤(Singleton) 패턴 - #2 싱글톤 패턴의 종류와 장단점 (74) | 2024.01.02 |
[Language/Java] 싱글톤(Singleton) 패턴 - #1 (33) | 2023.12.30 |
[Language/Java] 자바(Java)의 메모리 구조 (0) | 2023.11.29 |
[Language/Java] SDK, JDK, JRE, JVM, JIT 란? (1) | 2023.11.28 |