文書の過去の版を表示しています。
the Definition of Composite Pattern
컴포지트 패턴의 정의는 다음과 같습니다.
컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있습니다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체 들로 구성된 복합 객체(composite)를 똑같은 방법으로 다룰 수 있습니다.
가령 메뉴를 기준으로 생각해 봅시다. 이 패턴을 이용하면 중첩되어 있는 메뉴 그룹과 메뉴 항목을 똑같은 구조내에서 처리할 수 있습니다. 메뉴와 메뉴 항목을 같은 구조에 집어 넣어서 부분-전체 계층구조(part-whole hierachy)를 생성할 수 있습니다. 여기서 부분-전체 계층구조란, 부분(메뉴 및 메뉴 항목)들이 모여있지만, 모든 것을 하나로 묶어서 전체로 다룰 수 있는 구조를 뜻합니다.
일단 메뉴를 이런 방식으로 만들고 나면 컴포지트 패턴을 써서 객별 객체와 복합객체들을 똑같은 식으로 다룰 수 있습니다. 조금 어렵죠? 다시 설명해 보자면, 메뉴, 서브메뉴, 서브서브메뉴 등과 함께 메뉴 항목으로 구성된 트리 구조가 있다고 하면 각각이 모두 복합 객체가 될 수 있다는 것입니다. 각 메뉴 안에 다른 메뉴 및 메뉴 항목이 또 들어있을 수 있으니까요. 개별 개체도 결국 메뉴라고 할 수 있습니다. 다른 객체가 들어있지 않을 뿐 이죠. 앞으로 배우게 되겠지만, 컴포지트 패턴을 따르는 디자인을 사용하면 간단한 코드만 가지고도 (인쇄같은) 똑같은 작업을 전체 메뉴 구조에 대해서 반복해서 적용할 수 있습니다.
이제 컴포지트 패턴의 클래스 다이어그램을 살표볼 차례입니다.
Class Diagram
컴포지트 패턴을 메뉴에 어떻게 적용할 수 있을까요? 우선 구성요소 인터페이스를 만드는 것 부터 시작해야 됩니다. 이 인터페이스는 메뉴와 메뉴 항목 모두에 적용되는 공통 인터페이스 역할을 하며, 이 인터페이스가 있어야만 그 둘을 똑같은 방법으로 처리할 수 있습니다. 즉, 메뉴와 메뉴 항목에 대해서 같은 메소드를 호출 할 수 있게 되죠.
사실 메소드 중에는 메뉴 항목에 대해서 호출하는게 말이 안되는 것도 있을 것이고, 메뉴에 대해 호출하면 이상한 메소드도 있을 것입니다. 하지만 그런 문제를 해결하는 방법은 잠시 후에 알아보도록 하겠습니다. 일단 지금은 메뉴를 어떤 식으로 컴포지트 패턴에 끼워 맞출 수 있을지 생각해 봅시다.