유머조아
광고
글쓰기
일자순
조회수순
은꼴 (6)
유머 (5)
asdasdasda (1)
ascas (1)
asdasdas (1)

자바 상속 보시다시피 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를 통해 바로 접근 가능한 거고, 그래서 질문 주신 코드가 정상적으로 동작하는 겁니다.