클래스가 상속을 받으면 부모 클래스로부터 코드를 물려받게 됩니다. 이는 마치 유전 형질을 물려받은 것처럼 두 클래스 사이에 연관성을 깊게 합니다.
반면에, 인터페이스 구현은 마치 후천적으로 획득한 형질처럼 작동합니다.
상속은 두 클래스가 같은 종류인 것을 표현하는데 사용하고
인터페이스는 대상 클래스가 어떤 것을 할 수 있는지 표현하는데 사용합니다.
강아지, 고양이, 금붕어에 “사료 먹이기”가 각각 필요하고 중복이 된다.
애완동물 클래스를 만들고
강아지, 고양이, 금붕어는 “사료 먹이기”를 상속받아서 사용하고 있다.
*요구사항 추가: 애완동물 산책시키기
강이지, 고양이는 “걷기”를 통해서 산책시킬 수 있고
금붕어는 “헤엄치기”를 통해서 산책시킬 수 있다.
결국
육상동물 클래스를 만들어
강아지, 고양이는 “걷기”를 상속받아서 사용하고 있다.
*요구사항 추가: 오리가 애완동물로 추가
오리는 “걷기”도 할 수 있고, “헤엄치기”도 할 수 있다.
육상동물 클래스와 수생동물 클래스를 만들어
양쪽의 형질을 모두 이어 받으려면 다중상속이 필요하다.
(💁🏻♀️ 인터페이스 구현을 통해서 해결방법을 바꿔보자!!)
모든 동물들은 애완동물 클래스에서 바로 상속을 받는다.
그리고 동물들은 각각 할 수 있는 스킬이 다르기 때문에
스킬에 해당하는 부분들을 인터페이스로 구현한다.
이렇게 하면,
나중에 고양이가 훈련을 통해서 헤엄치기가 가능해져도 문제가 없다.
인터페이스는 얼마든지 추가하고 변경해도 문제가 없는 구조이기 때문이다.
인터페이스로 구현은 해두었지만
여전히 중복되었던 “걷기”와 “헤엄치기” 코드를 “걷기” 클래스와 “헤엄치기” 클래스에 위임하여 분리하였다.
인터페이스를 통해서 애완동물을 상속받은 모든 클래스가 얼마든지 애완동물 행동을 추가하고 변경할 수 있게 되어 유연성이 높아졌다.
객체가 할 수 있는 행위의 종류가 상황에 따라서 변화할 때는
상속보다는 인터페이스를 우선적으로 고려해야 한다.
상속은 유전 형질을 이어받는 것과 같은 효과가 있는 반면에
인터페이스 구현은 이것저것 교체하고 장착할 수 있기 때문이다.
그러나,
상속과 인터페이스 구현에 대한 절대적인 기준은 없다.
상속과 인터페이스의 성질을 정확히 파악하고
적절하게 사용하는 방법뿐이다.
참조