Inheritance vs Implementation

재사용과 역할을 분리하는 법

`extends`와 `implements`는 함께 쓸 수 있지만, 하나는 구현 재사용을, 다른 하나는 역할 보장을 담당합니다.

1

공유 구현 찾기

여러 클래스가 같은 상태와 기본 메서드를 가진다면 부모 클래스 후보입니다.

2

역할 계약 찾기

서로 다른 계층이 같은 기능을 제공해야 한다면 인터페이스 후보입니다.

3

깊이 제한

상속 단계가 깊어질수록 변경 영향이 커지므로 역할은 인터페이스로 빼냅니다.

`extends`가 맞는 경우

is-a

공통 상태, 기본 구현, 오버라이드 지점이 모두 있을 때 사용합니다.

`implements`가 맞는 경우

can-do

호출자가 필요한 메서드 모양을 보장하고 구현체는 자유롭게 바뀌어야 할 때 사용합니다.