Access Inheritance

상속 접근 지정자는 외부 API 노출 범위를 정한다

부모의 public, protected 멤버가 파생 클래스 안과 바깥에서 어떻게 보이는지에 따라 “is-a” 관계인지 구현 재사용인지가 갈립니다.

private 멤버 상속 방식과 무관하게 직접 접근 불가
외부 사용자 public으로 남은 인터페이스만 호출 가능
파생 클래스 protected 이상으로 남은 멤버를 구현에 활용
public

부모 인터페이스를 유지

Dog는 Animal처럼 사용할 수 있다는 의미를 가장 직접적으로 표현합니다.

Base public Derived public으로 유지
Base protected Derived protected로 유지
protected

외부 API에서 숨김

파생 계층 내부에서는 쓰지만, 객체 사용자에게 부모 API를 공개하지 않습니다.

Base public Derived protected로 낮아짐
Base protected Derived protected로 유지
private

구현 재사용에 가까움

외부에는 부모 타입처럼 보이지 않게 하고 내부 구현의 재료로만 사용합니다.

Base public Derived private로 낮아짐
Base protected Derived private로 낮아짐
Design Test

상속 타입 관계 검증

외부 코드가 파생 객체를 부모 타입으로 다뤄도 자연스럽다면 public 상속이 맞습니다. 그렇지 않다면 합성이나 private 상속을 다시 비교합니다.

is-a 부모 타입 자리에 파생 타입을 넣어도 의미가 유지되는가?
API 노출 부모의 public 함수가 파생 타입의 약속이어야 하는가?
재사용 코드 공유만 목적이라면 멤버 객체로 두는 편이 더 명확한가?