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
복사
위 예제에서는 컴포넌트, 리프, 컴포지트 클래스를 정의하고, 파일 시스템을 구현하는데 사용하였다. 이 예제에서는 파일 시스템의 폴더와 파일을 트리 구조로 표현하였고, 컴포지트 패턴을 사용하여 전체-부분 계층 구조를 일관적으로 처리하였다.