안녕하세요. 질문 주신 부분은 상속 개념 때문에 헷갈리신 것 같아요.
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를 통해 바로 접근 가능한 거고, 그래서 질문 주신 코드가 정상적으로 동작하는 겁니다.