Search

컴포지트 패턴

컴포지트 패턴

컴포지트 패턴은 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 만드는 패턴이다. 이 패턴은 전체-부분 간의 계층을 일관적으로 다룰 수 있도록 해준다.

구성

컴포지트 패턴은 세 가지 주요 구성요소로 이루어져 있다.

컴포넌트 (Component)

컴포넌트는 전체-부분 계층 구조에서 전체와 부분 모두에 해당하는 추상 클래스이다. 이 클래스는 전체와 부분이 동일한 인터페이스를 가지도록 하여 일관성을 유지하며, 전체에 대한 동작과 부분에 대한 동작을 정의한다.

리프 (Leaf)

리프는 전체-부분 계층 구조에서 더 이상 부분으로 나눌 수 없는 최하위 객체이다. 이 클래스는 컴포넌트의 하위 클래스로 이루어져 있으며, 전체-부분 계층 구조에서 단말 노드 역할을 한다.

컴포지트 (Composite)

컴포지트는 전체-부분 계층 구조에서 전체에 해당하는 객체이다. 이 클래스는 컴포넌트의 하위 클래스로 이루어져 있으며, 자식 컴포넌트를 가질 수 있다. 이러한 자식 컴포넌트는 또 다른 컴포지트나 리프가 될 수 있다.

활용

컴포지트 패턴은 다음과 같은 경우에 사용할 수 있다.
전체-부분 계층 구조를 가진 객체들 간의 일관성 있는 처리가 필요한 경우
부분을 나타내는 객체와 전체를 나타내는 객체를 구분하지 않고 일관성 있게 다루어야 하는 경우
객체들의 트리 구조를 사용하여 복합 객체를 만들어야 하는 경우

예제

컴포지트 패턴을 사용하여 파일 시스템을 구현하는 예제를 살펴보자.
class Component: def __init__(self, name): self.name = name def add(self, component): pass def remove(self, component): pass def display(self): pass class Leaf(Component): def display(self): print(self.name) class Composite(Component): def __init__(self, name): super().__init__(name) self.children = [] def add(self, component): self.children.append(component) def remove(self, component): self.children.remove(component) def display(self): print(self.name) for child in self.children: child.display() root = Composite("root") root.add(Leaf("file1")) root.add(Leaf("file2")) subdir = Composite("subdir") subdir.add(Leaf("file3")) subdir.add(Leaf("file4")) root.add(subdir) root.display()
Plain Text
복사
위 예제에서는 컴포넌트, 리프, 컴포지트 클래스를 정의하고, 파일 시스템을 구현하는데 사용하였다. 이 예제에서는 파일 시스템의 폴더와 파일을 트리 구조로 표현하였고, 컴포지트 패턴을 사용하여 전체-부분 계층 구조를 일관적으로 처리하였다.