05:42 [익명]

자바 상속 보시다시피 Child는 Parent를 상속받았고, 두 클래스는 서로 다른 패키지에 있습니다.Q.

보시다시피 Child는 Parent를 상속받았고, 두 클래스는 서로 다른 패키지에 있습니다.Q. Child에서 publicValue = 1;, protectedValue = 1; 꼴로 초기화를 하는게 어떻게 가능한가요?: Parent는 다른 클래스고, 그 멤버에 접근하려면 그것의 인스턴스를 생성해야 하는 것으로 알고있습니다. 그 인스턴스가 생성된 뒤 또 그것의 멤버에 접근하려면, Parent의 인스턴스 이름이 p라 하면, p.publicValue = 1;, p.protectedValue = 1; 같은 꼴로 접근하는 것 으로 알고있습니다. 제가 뭔가 잘못알고있는건가요?

안녕하세요. 질문 주신 부분은 상속 개념 때문에 헷갈리신 것 같아요.

Child 클래스가 Parent를 상속하면, Parent의 public / protected 멤버들은 Child 객체 안에 그대로 포함됩니다. 그래서 call() 메서드 안에서

publicValue = 1;

protectedValue = 1;

라고 쓰면 사실은 this.publicValue = 1; 같은 의미예요. 즉, 내가 만든 Child 인스턴스 안에 이미 Parent의 멤버가 들어와 있기 때문에 별도로 new Parent()를 만들 필요가 없는 거죠.

여기서 중요한 건 접근 제어자 차이인데요:

  • public → 어디서나 접근 가능

  • protected → 패키지가 달라도 상속받은 자식 클래스 내부라면 접근 가능

  • default → 같은 패키지에서만 접근 가능

  • private → 자식에서도 접근 불가

그래서 Child 안에서는 protectedValue에 접근할 수 있지만, 만약 다른 패키지에서

Parent p = new Parent(); p.protectedValue = 1;

이런 식으로는 접근이 안 돼요. (상속받은 게 아니라 단순 Parent 인스턴스를 참조하는 거라서요.)

정리하면, Child 입장에서는 Parent가 이미 자기 안에 포함돼 있으니까 this를 통해 바로 접근 가능한 거고, 그래서 질문 주신 코드가 정상적으로 동작하는 겁니다.

회원가입 혹은 광고 [X]를 누르면 내용이 보입니다
회원광고