서론
상속과 합성은 객체지향 프로그래밍에서 가장 널리 사용되는 코드 재사용 기법을 이야기한다.
상속이 부모 클래스와 자식 클래스를 연결해서 부모 클래스의 코드를 재사용하지만, 합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해 부분 객체의 코드를 재사용한다.
상속관계는 is - a라고도 불리고, 합성 관계는 has-a 관계라고 부른다.
여러 가지 내용이 있지만, 이는 결국 하나를 이야기하고 있는 것 같았다.
객체의 합성이 상속보다 더 좋은 방법이다.
상속을 합성으로 변경하기
코드 재사용을 위한 상속 남용시 발생하는 세 가지는 다음과 같다.
- 불필요한 인터페이스 상속 문제
- 메서드 오버라이딩의 오작용 문제
- 부모 클래스와 자식 클래스의 동시 수정 문제
포워딩 ( forwarding )
- 오퍼레이션을 오버라이딩한 인스턴스 메서드에서 내부 인스턴스에게 동일한 메서드 호출을 그대로 전달하는 방법
포워딩 메서드 ( forwarding method )
- 동일한 메서드를 호출하기 위해 추가된 메서드를 말한다.
몽키 패치 ( Monkey Patch )
- 현재 실행 중인 환경에만 영향을 미치도록 지역적으로 코드를 수정하거나 확장하는 것을 가리키는 것을 말한다.
상속으로 인한 조합의 폭발적인 증가
상속으로 인해 결합도가 높아지면 코드를 수정하는 데 필요한 작업의 양이 과도하게 늘어나는 경향이 있다.
작은 기능들을 조합하여 큰 기능들을 수행하는 객체를 만들어야하는 경우 다음과 같은 문제점이 발생한다.
- 하나의 기능을 추가하거나 수정하기 위해 불필요하게 많은 수의 클래스를 추가하거나 수정해야 한다.
- 단일 상속만 지원하는 언어에서는 상속으로 인해 오히려 중복 코드의 양이 늘어날 수 있다.
합성을 사용하면 상속에서 발생하는 클래스 증가와 중복 코드 문제를 해결할 수 있다. 그러니 합성을 쓰도록 하자!!!
추상 메서드와 훅 메서드
훅 메서드
- 추상 메서드와 동일하게 자식 클래스에서 오버 라이딩할 의도로 메서드를 추가했지만 편의를 위해 기본 구현을 제공하는 메서드
- 상속 계층에 속하는 모든 자식 클래스가 추상 메서드를 오버 라이딩을 해야 한다는 단점을 상쇄시킬 수 있다.
객체의 합성이 상속보다 더 좋은 방법이다.
- 객체지향에서 코드를 재사용하기위해 가장 널리 사용되는 방법은 상속이다. 하지만, 이는 우아한 방법이 아니다.
- 상속은 부모 클래스의 세부적인 구현에 자식 클래스를 강하게 결합시키기 때문에 코드의 진화를 방해한다.
- 합성은 객체의 인터페이스를 재사용하기 때문에 방해하지 않고 더 유연한 설계가 가능해진다.
믹스인
- 객체를 생성할 때 코드 일부를 클래스 안에 섞어 넣어 재사용하는 기법을 말한다.
- 합성이 실행 시점에 객체를 조합하는 재사용 기법이라면 믹스인은 컴파일 시점에 필요한 코드 조각을 조합하는 재사용 기법
그렇다면 믹스인과 상속은 비슷할까? NO!
상속의 진정한 목적은 자식 클래스를 부모 클래스와 동일한 개념적인 범주로 묶어 is-a 관계를 만들기 위한것이다.
믹스인은 말 그대로 코드를 다른 코드 안에 섞어 넣기 위한 방법이므로 이는 다르다.
믹스인은 추상 서브 클래스 ( abstract subclass )라고 부르기도 한다.
믹스인을 사용하게 되면 특정한 클래스에 대한 변경 또는 확장을 독립적으로 구현한 후 필요한 시점에 차례대로 추가할 수 있다.
마치며
해당 챕터에서는 이해를 돕기위한 코드 예제가 들어있었는데, 이때 믹스인 파트에는 스칼라를 활용해서 예시를 표현해주었다.
이전에 잠깐! 스칼라를 찍먹한 경험을 가지고 있어 해당 경험을 토대로 이해를 해보며 살펴보았는데 이를 통한 예제들을 학습해야겠다란 생각이 들었다..
'BOOK' 카테고리의 다른 글
[BOOK : 오브젝트 15장] 디자인 패턴과 프레임워크 (0) | 2022.12.18 |
---|---|
[BOOK : 오브젝트 14장] 일관성 있는 협력 (0) | 2022.12.10 |
[BOOK: 오브젝트 10장] 상속과 코드 재사용 (0) | 2022.11.18 |
[BOOK: 오브젝트 7장] 객체 분해 (0) | 2022.11.11 |
[BOOK: 오브젝트 6장] 메시지와 인터페이스 (0) | 2022.11.07 |