네, 가능합니다. 슈퍼클래스(부모 클래스)의 protected 메서드는 서브클래스(자식 클래스)에서 얼마든지 재정의(오버라이드)할 수 있습니다.
다만 중요한 규칙이 하나 있습니다. 슈퍼클래스의 메서드가 protected로 선언되어 있다면, 서브클래스에서 재정의하는 메서드는 protected 또는 public 접근 제어자만 사용할 수 있습니다. 즉, default(접근 제어자 생략)나 private으로 변경하는 것은 허용되지 않습니다.
이를 정리하면 다음과 같습니다. 재정의된 메서드는 부모 메서드보다 접근 범위가 같거나 더 넓어야 하며, 더 좁아질 수 없습니다.
protected→protected: 가능protected→public: 가능 (접근 범위 확대)protected→default: 불가능 (컴파일 오류 발생)protected→private: 불가능 (컴파일 오류 발생)
이러한 규칙이 존재하는 이유는 다형성(polymorphism) 때문입니다. 부모 클래스 타입의 참조 변수로 해당 메서드를 호출할 수 있다면, 실제 실행되는 자식 클래스의 메서드 역시 동일하게 호출 가능해야 합니다. 만약 자식 클래스에서 접근 범위를 축소하면, 부모 타입으로 호출하던 기존 코드가 런타임에 실패할 수 있기 때문에 컴파일 단계에서 이를 금지합니다.
예제 코드
class A {
protected void protectedMethod() {
System.out.println("슈퍼클래스의 protected 메서드");
}
}
class B extends A {
@Override
protected void protectedMethod() {
System.out.println("서브클래스의 protected 메서드");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
b.protectedMethod();
}
}실행 결과
서브클래스의 protected 메서드
위 예제에서 클래스 B는 클래스 A의 protectedMethod()를 동일한 protected 접근 제어자로 재정의했습니다. 객체 b의 메서드를 호출하면 재정의된 서브클래스의 메서드가 실행되는 것을 확인할 수 있습니다.
참고로 @Override 어노테이션을 붙이면 컴파일러가 부모 클래스의 메서드를 올바르게 재정의했는지 검증해 주므로, 실수로 인한 버그를 예방할 수 있어 사용하는 것이 좋습니다.