11장 정리

상속은 부모 클래스의 정의 대부분을 물려받으므로 제대로 사용하기 위해서는 부모 클래스의 내부 구현에 대해 상세히 알아야한다.
따라서 코드를 재사용할 수 있는 쉬운 방법이지만, 우아한 방법이라고는 할 수 없다.
합성은 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존한다.
그러므로 포함된 객체의 내부 구현이 변경되더라도 영향을 최소화할 수 있기 때문에 변경에 더 안정적인 코드를 얻을 수 있다.

상속을 합성으로 변경하기

10장에서 상속의 문제점들은 합성을 이용하면 구현이 아닌 인터페이스에 의존하기 때문에 보완이 가능하다.

상속으로 인한 조합의 폭발적인 증가

기능을 추가하면서 부모 클래스에 추상 메서드를 추가하면 상속받은 자식 클래스를 모두 수정해야한다.
하지만 여기서 수정하는 부분은 모두 구조가 비슷하지만 내부 구현이 조금씩만 다른 코드이므로 중복 코드의 양이 늘어난다.
이처럼 상속으로 인해 결합도가 높아지면 코드를 수정하는데 필요한 작업량이 과도하게 늘어날 수 있다.
이 또한 아래에서 설명할 합성을 이용하면 중복 코드 문제를 간단하게 해결할 수 있다.

합성 관계로 변경하기

상속 관계는 컴파일타임에 결정되고 고정되므로 코드를 실행하는 도중에는 변경할 수 없다.
따라서 여러 기능을 조합해야 하는 설계에 상속을 이용하면 조합 가능한 경우별로 클래스를 추가해야하는 클래스 폭발 문제를 겪는다.
내부 구현이 아닌 퍼블릭 인터페이스에 대해서만 의존하면 런타임에 객체의 관계를 변경할 수 있다.
합성은 이렇게 컴파일 타임 관계를 런타임 관계로 변경함으로써 이 문제를 해결한다.
물론 컴파일 타임과 런타임 의존성의 거리가 멀면 멀수록 설계의 복잡도가 증가하고 코드를 이해하기 어려워지지만 유지보수를 위한 트레이드 오프이다.

믹스인

믹스인은 객체를 생성할 때 코드 일부를 클래스 안에 섞어 넣어 재사용하는 기법을 가리킨다.
합성이 실행 시점에 객체를 조합하는 재사용 방법이라면, 믹스인은 컴파일 시점에 필요한 코드 조각을 조합하는 재사용 방법이다.
믹스인은 상속과는 다르게 is-a 관계가 아닌, 그냥 코드 조각을 다른 코드 안에 섞어 넣는 방법이다.
따라서 클래스와 클래스 사이의 관계를 고정시키지 않고 유연하게 관계를 재구성 할 수 있다.
상속처럼 상속 관계의 순서가 정해진게 아닌, 필요한 시점에 차례로 추가할 수 있는 쌓을 수 있는 변경의 특징을 가진다.

# 인상깊었던 점

"최선의 방법은 상속을 포기하는 것이다"
이번 장에서는 이 문장이 인상깊었다. 
합성이 왜 좋은지 알 수 있었고, 단순히 코드를 재사용하는거라면 합성이 상속보다 좋다는걸 알 수 있었다.
하지만 늘 그러하듯 합성을 사용하면 일종의 DSL처럼 자기만의 문법을 만드는것 같아서

변경 가능성이 낮은 단순한 기능에는 상속을 쓰고, 유연함이 필요한 부분에서는 합성을 써야할것 같다.
역시 좋은 설계를 위해서는 경험이 필요하다는 생각이 들었다.

'공부방 > 북스터디' 카테고리의 다른 글

[오브젝트] 13장  (0) 2024.04.08
[오브젝트] 12장  (0) 2024.03.26
[오브젝트] 10장  (0) 2024.03.04
[오브젝트] 9장  (0) 2024.02.20
[오브젝트] 8장  (0) 2024.02.06

+ Recent posts