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

hyejung9904님의 프로필 이미지
hyejung9904

작성한 질문수

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

접근제어자 질문

작성

·

243

1

안녕하세요, 강의 잘 보고 있습니다.

 

접근제어자 강의 수강 중인데, public, private, default 관련 사용법 알려주셔서 protected는 스스로 만들어보고 테스트 해봤습니다.

 

그런데, protected는 다른 패키지여도 자식클래스는 접근이 가능하다는데, 어떻게 사용해야하는건지, 왜 main에서 오류가 나는지 모르겠습니다..

package access.b;

import access.a.AccessData;

public class AccessMain extends AccessData {
    public static void main(String[] args) {

        AccessData data = new AccessData();

    
        // 이렇게 하면 안되는 이유
        data.protectedField = 5;
        data.protectedMethod();

        
    }

}

이렇게 했을 때 오류가 나고,

 

package access.b;

import access.a.AccessData;


public class AccessMain extends AccessData {
    public static void main(String[] args) {


        Test test = new Test();
        test.ts();

    }

}

class Test extends AccessData {
    void ts(){
        protectedField = 3;
        System.out.println("protected test 호출입니다.");
        protectedMethod();
    }

}

이런 식으로 접근하면 또 접근이 가능했습니다..

왜 그런건지, 어떤 경우에 이런식으로 쓰는건지, main에서는 왜 안되는건지 궁금합니다..

답변 1

0

AccessData data = new AccessData(); 부분을

AccessMain data = new AccessMain(); 으로 바꾸면

접근이 가능할 것 같습니다.

이유는 protected 접근제어자의 경우 자식클래스에서 접근이 가능한데, 추가적으로 접근하는클래스(AccessMain)가 "하위클래스의 인스턴스"를 이용해 접근을 해야한다는 것입니다.

전자의 경우 AccessMain이 AccessData의 자식클래스이지만, "하위클래스의 인스턴스"를 이용해 접근을 하지않고 부모 인스턴스를 이용해 접근하였기때문에 에러가 발생합니다.

후자의 경우 AccessMain이 AccessData의 자식클래스이며, "하위클래스의 인스턴스"를 이용해 접근을 하였기때문에 protected 접근제어자의 조건을 만족하므로 가능하게 됩니다.

완벽하지는 않으니 참고만 해주시면 감사하겠습니다!😉

hyejung9904님의 프로필 이미지
hyejung9904

작성한 질문수

질문하기