네, 가능합니다. Java에서 final로 선언된 메소드는 자식 클래스에 정상적으로 상속되며, 자식 클래스의 객체를 통해 호출할 수도 있습니다.
상속은 되지만, 오버라이딩은 불가능
final 키워드가 제한하는 것은 '상속'이 아니라 '재정의(오버라이딩)'입니다. 즉, 다음과 같은 동작이 이루어집니다.
- 부모 클래스의 final 메소드는 그대로 자식 클래스에 전달(상속)됩니다.
- 자식 클래스에서 해당 메소드를 동일한 시그니처로 재정의하면 컴파일 오류가 발생합니다.
예제 코드
class Parent {
public final void display() {
System.out.println("Parent의 final 메소드");
}
}
class Child extends Parent {
// 아래와 같이 재정의하면 컴파일 에러 발생
// public void display() { ... }
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display(); // 상속받았으므로 정상 호출 가능
}
}final 메소드를 사용하는 이유
- 메소드 동작 보장: 핵심 로직이 자식 클래스에서 임의로 변경되는 것을 막을 수 있습니다.
- 성능 최적화: 컴파일러가 메소드 인라이닝 등의 최적화를 적용하기 쉬워집니다.
참고: final 키워드의 다른 용도
- final 변수: 값(또는 참조)을 한 번만 할당할 수 있습니다.
- final 클래스: 아예 상속 자체가 불가능합니다. (예:
String,Integer)
정리
final 메소드는 상속은 되지만 오버라이딩은 금지됩니다. 반면 final 클래스는 상속 자체가 차단된다는 점을 혼동하지 않도록 주의하세요.