여기에서 말하는 상속은 클래스가 다른 클래스를 확장하는 구현상속만을 말합니다.
클래스가 인터페이스를 구현하거나, 인터페이스가 다른 인터페이스를 상속하는 것과는 무관합니다.
상속이란 상위클래스를 확장할 목적으로 하위클래스를 정의하는 것
상속은 올바르게 사용하면 코드를 재사용하고 하위클래스들을 추상화하여 다룰수 있는 강력한 수단이지만,
하위 클래스가 상위 클래스의 구현에 강하게 결합되어있기 때문에 상위 클래스의 매소드 변경이나 추가가 영향을 미치게 된다면 예기치 못한 오류들을 발생시킬 수 있습니다.
=> 캡슐화 문제
그래서 상속은 하위 클래스가 상위 클래스의 진짜 하위 타입인 경우에만 사용해야 합니다.
=> is-a 관계일 때만 사용 [하위클래스 is a 상위클래스]
기존 클래스를 상속하여 확장하는 대신, 기존 클래스의 인스턴스를 참조하도록 설계
=> 상위 클래스의 구현을 물려받지 않으므로 예상치 못한 결합 관계에서 발생하는 오류를 방지할 수 있음
=> 상속 대비 느슨한 결합과 캡슐화의 이점이 있음