Composite Pattern ?
Composite 패턴은 객체를 트리 구조로 구성하여 개별 객체와 객체 그룹을 동일하게 다루는 데 사용되는 구조적 디자인 패턴입니다. 이 패턴은 객체들이 개별 객체와 객체의 조합(Composite)을 일관되게 다룰 수 있게 해줍니다. 주로 트리 구조를 표현할 때 유용하며, 예를 들어 파일 시스템, 그래픽 UI 요소, 조직 구조 등을 모델링할 때 많이 사용됩니다.
Composite Pattern의 구성요소
Component : 트리 구조의 모든 객체가 상속받는 공통 인터페이스입니다. 여기에는 모든 객체가 가져야 할 공통 메서드들이 정의됩니다.
Leaf : 실제 작업을 수행하는 객체입니다. 트리 구조의 말단 노드에 해당하며, 더 이상 하위 객체를 가지지 않습니다.
Composite : 다른 컴포넌트(Leaf나 다른 Composite 객체)를 자식으로 가지는 복합 객체입니다. 자식 객체에 대한 작업을 수행하거나 자식 객체에 작업을 위임합니다.
복합체 패턴의 핵심은 재귀적 구조와 하위 객체에 대한 작업 위임입니다. 복합 객체는 하위 객체들을 순회하며 작업을 수행하고, 이러한 동작은 재귀적으로 이루어지기 때문에 복합 객체와 단일 객체를 동일한 방식으로 다룰 수 있습니다.
Composite Pattern의 장점
- 일관된 인터페이스 제공 : Composite 패턴을 사용하면 단일 객체(Leaf)와 복합 객체(Composite)를 동일한 인터페이스로 처리할 수 있습니다. 이로 인해 클라이언트 코드에서 객체 유형에 따라 조건문으로 분기하는 필요성이 줄어들어 코드가 단순해집니다.
- 재귀적 구조 지원 : Composite 패턴은 재귀적으로 트리 구조를 구성하고 관리할 수 있습니다. 이는 복잡한 계층 구조를 처리할 때 유용하며, 하위 객체에 대한 작업을 재귀적으로 적용할 수 있습니다.
- 확장성 : 새로운 종류의 구성 요소(예: 새로운 Leaf 또는 Composite 객체)를 추가할 때 기존 코드를 거의 수정하지 않아도 됩니다. 이는 OCP(개방-폐쇄 원칙, Open-Closed Principle)에 부합하여, 시스템의 유지보수성과 확장성을 높여줍니다.
- 관리 용이성 : 복합 객체와 단일 객체를 동일한 방식으로 다루므로, 복잡한 구조를 관리하기 쉽게 만듭니다. 예를 들어, 폴더와 파일을 동일한 방식으로 처리할 수 있어 파일 시스템과 같은 계층 구조를 효과적으로 관리할 수 있습니다.
Composite Pattern의 단점
- 복잡성 증가 : Composite 패턴을 구현할 때 구조가 지나치게 복잡해질 수 있습니다. 특히, 트리 구조가 깊어지면 객체 관리 및 메서드 호출이 복잡해질 수 있습니다. 이로 인해 코드의 이해도와 유지보수성이 떨어질 수 있습니다.
- 객체 관리 어려움 : 복합 객체가 많은 하위 객체를 포함할 경우, 하위 객체들을 관리하는 것이 어려울 수 있습니다. 하위 객체의 추가, 삭제, 검색 등의 작업이 복잡해질 수 있으며, 이로 인해 성능 저하가 발생할 수 있습니다.
- 단일 객체와 복합 객체 간 차이 모호 : 단일 객체와 복합 객체를 동일하게 처리할 수 있다는 장점이 있지만, 때로는 이 둘의 차이가 모호해질 수 있습니다. 특정 상황에서는 복합 객체와 단일 객체를 명확히 구분해야 할 필요가 있는데, Composite 패턴을 사용하면 이 구분이 어려워질 수 있습니다.