본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

컴포지트 패턴(Composite Pattern)은 객체들을 트리 구조로 묶어 부분과 전체의 계층을 표현하고, 클라이언트가 낱개 객체와 여러 객체를 담은 복합 객체를 같은 인터페이스로 다루게 하는 GoF 구조 패턴이다.

GoF 는 의도를 "부분-전체 계층을 나타내기 위해 객체들을 트리 구조로 구성한다. 컴포지트를 쓰면 클라이언트가 개별 객체와 객체의 합성물을 똑같이 다룰 수 있다"로 적는다.[1] 폴더 안에 파일과 다른 폴더가 들어 있어도 "크기를 구하라"는 요청을 똑같이 보낼 수 있는 구조가 대표적이다.

역할 설명
Component 낱개와 복합 객체의 공통 인터페이스. 공통 연산(예: draw, getSize)을 정의한다
Leaf 자식이 없는 낱개 객체. 연산을 직접 수행한다
Composite 자식 Component 들을 담는 복합 객체. 연산을 자식들에게 돌려 수행하고 결과를 모은다. 자식 추가·제거 연산을 가진다
Client Component 인터페이스로만 다룬다

클래스 다이어그램에서는 Composite 가 Component 를 상속(실현)하면서 동시에 Component 여러 개를 합성으로 가지는 재귀 구조가 특징이다.

  • GUI 화면 계층 - Java AWT 의 Container 는 다른 AWT 컴포넌트를 담을 수 있는 컴포넌트이고, Container 자신도 Component 이므로 창 안에 패널, 패널 안에 버튼을 겹겹이 넣을 수 있다.[2]
  • MVC 의 뷰 - 고전적 MVC 에서 뷰 객체들은 창, 표 같은 복합 뷰, 버튼 같은 개별 뷰가 중첩된 컴포지트이다. 사용자 입력과 화면 표시는 이 계층의 어느 수준에서도 일어날 수 있다.[3]
  • 파일 시스템의 디렉터리·파일, 조직도, 문서의 장·절·문단, 수식 트리
  • 장점 - 클라이언트 코드가 낱개·복합을 구분하는 조건문 없이 단순해진다. 새 종류의 구성 요소를 더하기 쉽다.
  • 단점 - 공통 인터페이스가 지나치게 일반화되어, 특정 복합 객체에 들어갈 수 있는 자식 종류를 타입으로 제한하기 어렵다.

비슷한 구조 패턴과 구별하기

편집 원본 편집
패턴 목적 구조
컴포지트 부분-전체를 같은 방식으로 다룬다 여러 자식을 가진 트리
데코레이터 객체에 기능을 덧붙인다 하나를 감싸는 사슬
프록시 접근을 통제한다 실제 객체 하나를 대리
  1. ↑ 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).
  2. ↑ 「Class Container」, Java SE 8 API, Oracle, https://docs.oracle.com/javase/8/docs/api/java/awt/Container.html, 확인일: 2026-11-04.
  3. ↑ 「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.