접근 수정자 protected는 클래스의 멤버가 동일한 패키지 내에서와 모든 서브클래스 내에서 보일 수 있도록 허용합니다. 서브클래스가 다른 패키지에 있더라도 가능합니다.
다른 수정자와의 차이점:
private — 현재 클래스 내에서만 접근 가능protected — 현재 패키지 내에서와 패키지 외 서브클래스에서 접근 가능public — 어디서나 접근 가능예시:
package com.example.base; public class Parent { protected void sayHello() { System.out.println("Hello from parent"); } } package com.example.child; import com.example.base.Parent; public class Child extends Parent { public void tryHello() { sayHello(); // 접근 가능함! } } public class NotChild { public void fail(Parent p) { // p.sayHello(); // 오류: 접근 불가능 } }
외부 클래스(상속받지 않음)가 다른 패키지의
protected메서드에 접근할 수 있을까요? 해당 클래스의 객체를 가진 경우.
답변: 아니요, 다른 패키지의 protected 메서드에 대한 접근은 오직 서브클래스만 가능하며, this를 통해서나 서브클래스 객체에 대한 참조로만 가능합니다. 부모 클래스를 통해서는 접근할 수 없습니다.
Parent p = new Child(); p.sayHello(); // 오류! ((Child) p).sayHello(); // 성공 (Child 내에서 호출될 경우)
이야기
큰 모듈화된 프로젝트에서 개발자는 중요한 비즈니스 메서드를
protected섹션에 배치했으며, 외부 패키지에서는 접근할 수 없다고 생각했습니다. 다른 개발자들은 같은 패키지에서 이 메서드를 실수로 사용했으며, 이후 클래스 이동으로 인해 예상치 못한 접근 오류가 발생했습니다.
이야기
마이크로서비스 프로젝트에서
protected접근의 메서드를 다른 패키지에서 부모 타입의 참조로 호출하려고 했으나 호출이 실패했습니다. 이는 시스템 확장 메커니즘의 일부에서 실패를 초래했으며, 이로 인해 가시성에 대한 잘못된 이해가 문제가 되었습니다.
이야기
오픈 소스 라이브러리에서
protected필드가 너무 넓은 범위의 클래스에 접근 가능하게 사용되어, 객체의 내부 상태에 우연히 손상을 주었고, 이는 외부 응용 프로그램에서 문제를 일으켰습니다.