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

자바에서 접근 제어자만 바꿔서 메서드를 오버라이딩할 수 있을까?

결론: 가능합니다

네, 자바(Java)에서는 접근 제어자(access modifier)를 변경하는 것만으로도 메서드를 재정의(오버라이딩)할 수 있습니다. 단, 반드시 지켜야 하는 핵심 규칙이 하나 존재합니다.

핵심 규칙: 접근 수준은 더 좁아질 수 없다

오버라이딩한 메서드의 접근 수준은 원본(슈퍼클래스) 메서드보다 더 제한적일 수 없습니다.

예를 들어, 슈퍼클래스의 메서드가 public으로 선언되어 있다면, 서브클래스에서 이를 오버라이딩할 때 private이나 protected로 지정할 수 없습니다.

접근 제어자의 넓이 순서

자바의 접근 제어자는 아래와 같이 넓은 순서로 정렬됩니다.

  • private: 같은 클래스 내부에서만 접근 가능
  • default(패키지 프라이빗): 같은 패키지 내에서 접근 가능
  • protected: 같은 패키지 + 상속받은 하위 클래스에서 접근 가능
  • public: 어디서든 접근 가능

허용되는 오버라이딩 조합

  • publicpublic만 가능
  • protectedprotected, public 가능
  • defaultdefault, 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) 때문입니다. 부모 타입의 참조 변수로 자식 객체를 호출할 때, 호출하는 쪽에서는 부모 메서드의 접근 수준으로 접근 가능 여부를 판단합니다. 만약 자식 클래스에서 접근 범위를 축소할 수 있다면, 외부에서 정상적으로 호출 가능했던 메서드가 갑자기 접근 불가능해지는 모순이 발생합니다. 따라서 자바는 오버라이딩 시 접근 범위를 같거나 더 넓게만 허용하도록 설계되었습니다.