반응형
회사 업무를 진행 하면서 컴포지트 패턴을 적용하여 개발을 하였다.
정확한 이해를 하고 사용해야 할 것 같아서 두고두고 보기 위해 정리 한다.
컴포지트 패턴이란??
컴포지트(Composite) 패턴은 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을
표현하는 패턴이며 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
컴포지트 패턴(Composite Pattern)은 구조(Structural) 패턴 중 하나로써 여러 객체를 가진 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용하는 패턴이다.
컴포지트 패턴을 사용하는 이유!?
상속의 한계 - 설계가 거대해질 수록 예외 케이스가 늘어나 OCP(Open-Closed Principle)가 지켜지지 않는다. 이러한 상속의 문제를 해결하기 위해 컴포넌트 조립식 프로그래밍을 하기 위해 컴포지트 패턴을 사용한다.
OCP란?
개방-폐쇄 원칙(OCP, Open-Closed Principle)은 "소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다"는 프로그래밍 원칙이다.
출처 https://09297.tistory.com/6
구조
Component
Leaf와 Composite 가 구현해야하는 인터페이스, Leaf 와 Composite 는 모두 Component 라는 같은 타입으로 다뤄짐.
집합 관계에 정의될 모든 객체에 대한 인터페이스를 정의.
모든 클래스에 해당하는 인터페이스에 대해서는 공통의 행동을 구현.
전체 클래스에 속한 요소들을 관리하는 데 필요한 인터페이스를 정의.
순환 구조에서 요소들을 관리하는 데 필요한 인터페이스를 정의.
Leaf
기본 구성 요소의 기본 동작을 구현한다.
가장 말단의 객체, 즉 자식이 없는 객체.
객체 합성에 가장 기본이 되는 객체의 행동을 정의.
Composite
전체 클래스
Leaf를 요소로 가짐.
복수개의 Leaf, 복수개의 Composite객체를 부분으로 가질 수 있다.
자식이 있는 구성 요소에 대한 행동을 정의.
자신이 복합하는 요소들을 저장하면서, Component 인터페이스에 정의된 자식 관련 연산을 구현합니다.
장점/단점
장점
- 기본 객체와 복합 객체로 구성된 하나의 일관된 클래스 계통을 정의.
- 런타임 기본 객체와 복합 객체를 구분하지 않고 일관되게 프로그래밍 가능.
- 복합 구조나 단일 객체나 동일한 코드로 작성되기 때문에 사용자 코드가 단순해진다.
- 새로운 종류의 구성 요소를 쉽게 추가 가능.
- 새롭게 정의된 Composite나 Leaf의 서브클래스들은 기존에 존재하는 구조들과 독립적으로 동작이 가능하게 됨.
단점
- 설계가 지나치게 많은 범용성을 가진다.
- 복합체의 구성요소에 제약을 가하기 힘들다.
- 복합체가 오직 한 개의 구성 요소만 있었으면 할 때가 있는데 Composite 클래스만 가지고는 이를 제어하기 어렵기 때문에 런터임 점검에 들어가게 된다.
출처
- https://dev-gloomyfox.tistory.com/entry/Design-Pattern-09-Composite-Pattern%EB%B3%B5%ED%95%A9%EC%B2%B4-%ED%8C%A8%ED%84%B4
- https://dailyheumsi.tistory.com/193
반응형