-
[디자인패턴] 상속보다는 컴포지션을 사용하자!!!Computer Basis/디자인패턴 및 설계이론 2022. 2. 17. 17:56
현업자들이 모여있는 오픈톡방에서 상속과 컴포지션에 대한 이야기가 흘러나왔다.
ㅎㅎ ...;;; 정말 난 모르는게 많구나....이제라도 알아가면 되지 뭐!!!아래의 블로그포스팅을 쓰신분이 여러블로그와 책을 기반으로 작성하셔서 읽으며 매우 이해가 잘되어
이분의 포스팅을 기반으로 노트필기 느낌으로 포스팅을 작성하려 한다...!!
(베껴쓰지 않고 본인이 연구해서 포스팅하시는 분들이 최고야!!!)
상속보다는 컴포지션을 사용하라
누군가에게 상속과 composite의 개념에 대해 듣고 정리를 하기 위해 여러 블로그들을 참조하고, Effective Java 3/E Item 18. 상속보다는 컴포지션을 사용하라. 의 내용 정리입니다.
smjeon.dev
* 해당 포스팅은 위 블로그의 게시물을 받아쓰기하며 뇌에 다시 한번 넣는 포스팅입니다.
# 중요 개념
1. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. (상위클래스의 구현에 따라 하위클래스가 영향을 받아 동작에 이상이 생길 수 있다.)
2. 상속은 Is-A 관계에 쓰나 Is-A 관계더라도 안심하면 안된다. (1번의 위험성은 여전하기 때문)
*상위 클래스가 확장을 고려했고, 문서화도 잘 된 클래스라면 안전하다.
상속의 취약점을 피하려면 상속 대신 Composition과 Forwarding을 사용하자.
Java 기본 라이브러리의 Stack 과 Vector 는 IS-A 관계가 아니나, Stack 이 Vector를 상속하여 구현이 되어있다.
(잘못된 관계이지만, 문제를 바로잡기엔 너무 늦어 바꿀 수 없게 되었다고 한다.)
# 컴포지션
Has-A 관계이다.
상속으로 구성되지 않았기에 상위클래스의 변화로 하위클래스가 오작동하는일은 사라진다.아래는 상속관계와 컴포지션 관계를 한번에 이해 할 수 있는 예시이다.
class Engine {} // The Engine class. class Automobile {} // Automobile class which is parent to Car class. class Car extends Automobile { // Car is an Automobile, so Car class extends Automobile class. private Engine engine; // Car has an Engine so, Car class has an instance of Engine class as its member. }
* Car Is-A Automobile, Car Has-A Engine.
# 상속을 사용 할 때 고려해야 할점
- 확장하려는 클래스의 API에 아무런 결함이 없는가?
- 결함이 있다면, 이 결함이 여러분 클래스의 API까지 전파돼도 괜찮은가?
728x90'Computer Basis > 디자인패턴 및 설계이론' 카테고리의 다른 글
[설계이론] Project Structure - 프로젝트 구성을 어떻게 설계해야 할까? (패키지 분리기준) (0) 2022.03.27 [디자인패턴] 싱글톤패턴을 쓰는 이유와 주의할 점 (0) 2022.03.15 [설계이론] 마이크로서비스 아키텍처(MSA)는 언제 고려해야하는가? (0) 2022.02.03 [디자인패턴] 템플릿패턴(Template Pattern) (0) 2022.01.26 [설계이론] Over-fetching & Under-fetching (0) 2021.12.01