결론: 가능합니다
네, 자바(Java)에서는 접근 제어자(access modifier)를 변경하는 것만으로도 메서드를 재정의(오버라이딩)할 수 있습니다. 단, 반드시 지켜야 하는 핵심 규칙이 하나 존재합니다.
핵심 규칙: 접근 수준은 더 좁아질 수 없다
오버라이딩한 메서드의 접근 수준은 원본(슈퍼클래스) 메서드보다 더 제한적일 수 없습니다.
예를 들어, 슈퍼클래스의 메서드가 public으로 선언되어 있다면, 서브클래스에서 이를 오버라이딩할 때 private이나 protected로 지정할 수 없습니다.
접근 제어자의 넓이 순서
자바의 접근 제어자는 아래와 같이 넓은 순서로 정렬됩니다.
- private: 같은 클래스 내부에서만 접근 가능
- default(패키지 프라이빗): 같은 패키지 내에서 접근 가능
- protected: 같은 패키지 + 상속받은 하위 클래스에서 접근 가능
- public: 어디서든 접근 가능
허용되는 오버라이딩 조합
public→public만 가능protected→protected,public가능default→default,protected,public가능private→ 애초에 상속되지 않으므로 오버라이딩 대상이 아님
올바른 예제: 접근 범위 확대
class Parent {
protected void greet() {
System.out.println("부모 클래스의 인사");
}
}
class Child extends Parent {
@Override
public void greet() { // protected → public: 허용됨
System.out.println("자식 클래스의 인사");
}
}잘못된 예제: 접근 범위 축소
class Parent {
public void greet() {
System.out.println("부모 클래스의 인사");
}
}
class Child extends Parent {
// 컴파일 오류 발생!
// public → private은 더 좁은 범위이므로 허용되지 않음
private void greet() {
System.out.println("자식 클래스의 인사");
}
}왜 이런 규칙이 필요할까?
이 규칙은 다형성(polymorphism) 때문입니다. 부모 타입의 참조 변수로 자식 객체를 호출할 때, 호출하는 쪽에서는 부모 메서드의 접근 수준으로 접근 가능 여부를 판단합니다. 만약 자식 클래스에서 접근 범위를 축소할 수 있다면, 외부에서 정상적으로 호출 가능했던 메서드가 갑자기 접근 불가능해지는 모순이 발생합니다. 따라서 자바는 오버라이딩 시 접근 범위를 같거나 더 넓게만 허용하도록 설계되었습니다.