인프런 커뮤니티 질문&답변

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

김영한의 실전 자바 - 기본편

super - 부모 참조

상속 질문

작성

·

446

·

수정됨

3

public class ExtendsAccessMain{

    public static void main(String[] args) {

        Child child = new Child();
        int value1 = child.publicValue;

        int value2 = child.protectedValue;
        
        

        child.call();

    }

안녕하세요 상속 관련하여 질문이 있습니다.

parent를 상속 받은 child 인스턴스 생성 시

parent에 있는 protected 접근 제어자 필드 값은 접근이

안되더라구요 자식 클래스 레벨에서는 접근이 되지만 자식 인스턴스 생성 시에는 접근이 안되는 이유가 있을까요?

(부모 클래스와 같은 패키지에 메인이 있으면 접근 가능했습니다.)

 

답변 1

6

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. seunghoonL님

protected 멤버에 대한 접근은 자식 클래스의 메서드나 생성자 내부에서 일어나야 합니다.

지금과 같이 자식 클래스 외부에서 접근하는 것은 허용되지 않습니다.

쉽게 이야기하자면 private을 떠올려보시면 됩니다.

private은 외부에서 접근이 불가능합니다. protected는 private 처럼 외부에서 접근이 불가능하지만, 자식 클래스 내부에서만 접근이 가능하도록 허용한 것이라 생각하시면 됩니다.

감사합니다.

hoonseung님의 프로필 이미지
hoonseung
질문자

답변 감사합니다 또 궁금한점이..

부모 클래스와 같은 패키지에서는 외부에서 접근이 가능한부분이 있는거 같아서요

parent 클래스가 속한 패키지에 메인 클래스를 만들고 메인 안에서 child 인스턴스 생성 시에는 child.protectedValue 접근이 가능한거는 어떤 이유인지 궁금합니다.

* 패키지 구조

child

  • Child

parent

  • Parent

  • ExtendAccessMain

     

    입니다.

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. seunghoonL님

강의 자료에 보시면 다음과 같이 정의되어 있습니다.

  1. 접근 제어자 -> 접근 제어자 종류

접근 제어자의 종류

* private: 모든 외부 호출을 막는다.

* default(package-private): 같은 패키지안에서 호출은 허용한다.

* protected: 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.

* public: 모든 외부 호출을 허용한다.

 

protected는 상속 관계 + 같은 패키지안에서 호출은 허용합니다.

 

말씀하신 내용중에 ExtendAccessMain과 Parent.protectedValue는 같은 패키지 입니다. 따라서 접근이 가능합니다. 여기에 추가로 child.protectedValue에 접근하려면 child에서 다시 parent에 접근하는 것이 필요합니다. Parent와 Child는 상속관계입니다. 따라서 Child를 통해서 Parent.protectedValue에도 접근할 수 있습니다.

감사합니다.

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

질문하기