같은 멤버도 호출 위치에 따라 허용 여부가 달라진다
protected는 “외부 공개”가 아니라 “상속받은 클래스 내부에서만 열리는 통로”다.
부모 클래스
class Animal {
protected:
int age;
public:
void grow();
};
파생 클래스와 외부 코드
class Dog : public Animal {
void bark() {
age++; // 허용
}
};
int main() {
Dog dog;
dog.age++; // 차단
}
호출 위치
public
protected
private
같은 클래스 내부
허용
자기 멤버 함수가 직접 사용한다.
자기 멤버 함수가 직접 사용한다.
허용
상속용 멤버도 내부에서는 접근 가능하다.
상속용 멤버도 내부에서는 접근 가능하다.
허용
상태와 구현을 직접 관리한다.
상태와 구현을 직접 관리한다.
파생 클래스 내부
허용
상속된 공개 API를 호출한다.
상속된 공개 API를 호출한다.
허용
부모가 의도한 확장 지점만 사용한다.
부모가 의도한 확장 지점만 사용한다.
차단
부모 내부 상태는 직접 만질 수 없다.
부모 내부 상태는 직접 만질 수 없다.
외부 코드
허용
객체 사용자가 호출하는 계약이다.
객체 사용자가 호출하는 계약이다.
차단
상속 설계용 통로라 외부에 보이지 않는다.
상속 설계용 통로라 외부에 보이지 않는다.
차단
객체의 내부 구현을 숨긴다.
객체의 내부 구현을 숨긴다.
판정 기준: “멤버가 어디에 선언됐는가”보다 “그 멤버를 어떤 코드가 직접 만지려 하는가”를 먼저 본다.