← 질문 목록
#265깊이 0
컴포지트 패턴을 어떤 상황에서 사용하는가?
전체와 부분의 관계를 가진 객체들을 동일한 인터페이스로 다루기 위해 사용한다. 단일 객체와 복합 객체를 구분하지 않고 하나의 타입으로 처리하고 싶을 때다.
| 기준 | 리프(Leaf) | 컴포지트(Composite) |
|---|---|---|
| 구성 요소 | 단일 객체 | 리프와 컴포지트의 집합 |
| 인터페이스 | 기본 동작으로 구현 | 자식 요소들의 동작을 위임 |
클라이언트는 형변환도 타입 구분도 하지 않고 공통 인터페이스만 부른다. 그냥 호출하면 리프는 자기 일을 하고, 컴포지트는 자식들을 돌며 같은 일을 시킨다.
이 방식은 트리 구조의 데이터를 같은 인터페이스로 다룰 때 잘 맞는다. 폴더와 파일로 구성된 파일 시스템이나 UI 컴포넌트 계층 구조가 대표적인 사례다.
다만, 자식 요소의 제약을 추가하기로 어렵다. 특정 컴포지트에만 특정 리프를 넣고 싶을 때, 인터페이스에 모든 메서드를 지원해야 하므로 런타임으로 체크해야 하는 단점이 있다.