재사용: 상속 vs 구성? + 인터페이스?
클래스를 재사용하는 것에는 여러가지 방법이 있다.
만약 기존에 존재하던 Foo라는 클래스를 기반으로 새로운 클래스 Bar를 만들 필요가 있다고 하자.
Bar에서는 Foo의 함수 foo를 땡겨써야 한다.
1.상속(일반 상속)
그냥 클래스를 상속하는 것이다.
Is a 관계라고 한다.

이대로 돌려도 돌아가는건 잘 돌아간다.
하지만 객체지향적 관점을 보면 이러한 형태의 재사용을 행하는 코드는 대부분 나쁜 코드다.
생각해보자. 하위 클래스는 상위 클래스의 모든 것을 물려받는다.
따라서 Bar에서는 Foo의 foo 메서드를 자유롭게 사용할 수 있고, 이건 외부에서도 마찬가지다.
Bar가 Foo의 메서드 foo를 갖는게 자연스러운 상황이라면 괜찮지만, 단순한 재사용이 목적이라면 어울리지 않을 것이다.
말도 안되는 논리적 구조를 내재하게 되는 것이다.
로버트 마틴 선생의 주장에 따르면, 상속은 "행위"에 의해 이뤄져야 하는 것이다. 반드시 상위 클래스의 모든 행위를 가질 필요가 있을 때만 상속을 사용해야 한다는 말이다.
단순한 재사용에는 상속을 사용해선 안 된다.
그래서 대부분의 재사용에서는 상속보단 구성(소유)을 사용해야 한다.
2.구성(소유)
재사용할 클래스를 객체로 소유하는 것이다.
has a 관계라고 한다.

이런 식으로 재사용을 한다면 Foo의 메서드 등이 쓸데없이 Bar에서 밖으로 노출되지 않고, Bar 내에서만 유연하게 사용할 수 있게 된다.
대부분의 단순 재사용은 이런 방식을 쓰면 된다.
근데 단순한 재사용을 넘어서, 재사용할 클래스를 수정하거나 추가할 필요가 있다면 어째야 할까?
이럴때는 또 상속과 구성을 동시에 활용해야 한다.
그리고 일반 상속이 아닌, 인터페이스 상속을 사용한다.
상속받을 클래스에 대한 인터페이스 IFoo를 만들고, Bar 안에 집어넣는다.

그런데 인터페이스만 넣었으니 저대로 동작할리가 없지 않은가?
그럼 저기 들어갈 객체를 필요할때마다 구현해서 집어넣으면 된다.

이러면 필요할때마다 클래스를 유연하게 바꿔먹으며 돌릴 수 있다.
이게 대표적인 디자인패턴 중 하나인, 스트래티지 패턴이다.