컴포지트 패턴
IT위키
더 많은 작업
- 상위 문서: 소프트웨어 디자인 패턴
컴포지트 패턴(Composite Pattern)은 객체들을 트리 구조로 묶어 부분과 전체의 계층을 표현하고, 클라이언트가 낱개 객체와 여러 객체를 담은 복합 객체를 같은 인터페이스로 다루게 하는 GoF 구조 패턴이다.
GoF 는 의도를 "부분-전체 계층을 나타내기 위해 객체들을 트리 구조로 구성한다. 컴포지트를 쓰면 클라이언트가 개별 객체와 객체의 합성물을 똑같이 다룰 수 있다"로 적는다.[1] 폴더 안에 파일과 다른 폴더가 들어 있어도 "크기를 구하라"는 요청을 똑같이 보낼 수 있는 구조가 대표적이다.
| 역할 | 설명 |
|---|---|
| Component | 낱개와 복합 객체의 공통 인터페이스. 공통 연산(예: draw, getSize)을 정의한다 |
| Leaf | 자식이 없는 낱개 객체. 연산을 직접 수행한다 |
| Composite | 자식 Component 들을 담는 복합 객체. 연산을 자식들에게 돌려 수행하고 결과를 모은다. 자식 추가·제거 연산을 가진다 |
| Client | Component 인터페이스로만 다룬다 |
클래스 다이어그램에서는 Composite 가 Component 를 상속(실현)하면서 동시에 Component 여러 개를 합성으로 가지는 재귀 구조가 특징이다.
- 장점 - 클라이언트 코드가 낱개·복합을 구분하는 조건문 없이 단순해진다. 새 종류의 구성 요소를 더하기 쉽다.
- 단점 - 공통 인터페이스가 지나치게 일반화되어, 특정 복합 객체에 들어갈 수 있는 자식 종류를 타입으로 제한하기 어렵다.
| 패턴 | 목적 | 구조 |
|---|---|---|
| 컴포지트 | 부분-전체를 같은 방식으로 다룬다 | 여러 자식을 가진 트리 |
| 데코레이터 | 객체에 기능을 덧붙인다 | 하나를 감싸는 사슬 |
| 프록시 | 접근을 통제한다 | 실제 객체 하나를 대리 |
- ↑ Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, 『Design Patterns: Elements of Reusable Object-Oriented Software』, Addison-Wesley, 1994, ISBN 0-201-63361-2, pp. 163-173(Composite).
- ↑ 「Class Container」, Java SE 8 API, Oracle, https://docs.oracle.com/javase/8/docs/api/java/awt/Container.html, 확인일: 2026-11-04.
- ↑ 「Model-View-Controller」, Apple Developer Documentation Archive, https://developer.apple.com/library/archive/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html, 확인일: 2026-11-04.