Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 protected 메서드는 재정의할 수 있을까? 접근 제어자 규칙 총정리

네, 가능합니다. 슈퍼클래스(부모 클래스)의 protected 메서드는 서브클래스(자식 클래스)에서 얼마든지 재정의(오버라이드)할 수 있습니다.

다만 중요한 규칙이 하나 있습니다. 슈퍼클래스의 메서드가 protected로 선언되어 있다면, 서브클래스에서 재정의하는 메서드는 protected 또는 public 접근 제어자만 사용할 수 있습니다. 즉, default(접근 제어자 생략)나 private으로 변경하는 것은 허용되지 않습니다.

이를 정리하면 다음과 같습니다. 재정의된 메서드는 부모 메서드보다 접근 범위가 같거나 더 넓어야 하며, 더 좁아질 수 없습니다.

  • protectedprotected: 가능
  • protectedpublic: 가능 (접근 범위 확대)
  • protecteddefault: 불가능 (컴파일 오류 발생)
  • protectedprivate: 불가능 (컴파일 오류 발생)

이러한 규칙이 존재하는 이유는 다형성(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는 클래스 AprotectedMethod()를 동일한 protected 접근 제어자로 재정의했습니다. 객체 b의 메서드를 호출하면 재정의된 서브클래스의 메서드가 실행되는 것을 확인할 수 있습니다.

참고로 @Override 어노테이션을 붙이면 컴파일러가 부모 클래스의 메서드를 올바르게 재정의했는지 검증해 주므로, 실수로 인한 버그를 예방할 수 있어 사용하는 것이 좋습니다.