Design Pattern

[디자인 패턴] 컴포짓 패턴 (Composite Pattern)

꾸준함. 2024. 6. 22. 19:50

컴포짓 패턴

  • 개별 객체와 객체 그룹을 동일하게 다루기 위한 디자인 패턴
  • 클라이언트 입장에서는 `전체`나 `부분`이나 모두 동일한 컴포넌트로 인식할 수 있도록 계층 구조를 만듦 (Part-Whole Hierarchy)
  • 단, 트리 구조를 사용하여 객체를 구성해야한다는 제약 조건 존재

 

https://en.wikipedia.org/wiki/Composite_pattern

 

주요 구성 요소

 

1. Component

  • 공통 인터페이스를 정의
  • Compsite 및 Leaf가 구현해야하는 메서드를 선언

 

2. Leaf

  • 트리의 말단 요소로 실제 작업을 수행
  • Leaf 노드는 자식 노드를 가질 수 없음

 

3. Composite

  • 자식 노드를 가지는 복합 노드
  • 자식 노드를 관리하며 Component의 메서드를 구현

 

컴포짓 패턴 구현 예시

 

1. Component 인터페이스 정의

 

 

2. Leaf 클래스 정의

 

 

3. Composite 클래스 정의

 

 

4. Client 코드 예시 


 

부연 설명

  • Graphic 인터페이스: draw 메서드를 정의하여 모든 그래픽 요소들이 이를 구현하도록 메서드 선언
  • Circle과 Square 클래스 (Leaf): Graphic 인터페이스를 구현하며 draw 메서드를 통해 구체적인 작업을 수행
  • CompositeGraphic 클래스 (Composite): Graphic 인터페이스를 구현하며, 자식 그래픽 요소들을 추가, 제거 및 그리기 작업을 수행
  • Client: 클라이언트 코드로, 트리 구조를 구성하고 전체 트리 구조를 그림

 

컴포짓 패턴 장단점

 

장점

  • 복잡한 트리 구조를 편리하게 사용할 수 있음
  • Composite 클래스를 통해 다형성과 재귀를 활용할 수 있음
  • 클라이언트 코드를 변경하지 않으면서 새로운 엘리먼트 타입(Leaf)을 추가 가능

 

단점

  • 공통된 인터페이스를 가지는 트리를 만들어야 한다는 제약 사항 때문에 지나치게 일반화해야 하는 경우가 생길 수 있음
    • Composite Pattern에서는 개별 객체(Leaf)와 복합 객체(Composite)가 동일한 인터페이스를 구현해야 함
    • 이로 인해, 단순한 객체와 복합 객체 간의 공통된 인터페이스를 정의해야 하는데, 이는 때로 지나치게 일반화된 인터페이스를 만들어야 하는 상황을 초래할 수 있음
    • ex) Leaf 클래스들이 개별적으로 특화된 메서드를 가져야 할 경우 공통 인터페이스로 추가하기 어려움

 

실무에서 쓰이는 컴포짓 패턴 

 

1. 자바의 Swing 라이브러리

  • Swing 라이브러리는 GUI 컴포넌트들을 구성하고 관리하는 데 있어 Composite Pattern을 활용하는 대표적인 예
  • Swing은 자바에서 GUI 애플리케이션을 만들기 위한 라이브러리로, 다양한 컴포넌트들(버튼, 텍스트 필드, 패널 등)을 제공하며 이들을 계층적으로 배치 가능
  • Swing의 모든 컴포넌트는 javax.swing.JComponent 클래스를 상속받으며 해당 클래스는 모든 컴포넌트가 가져야 할 공통된 메서드와 속성을 정의
  • Swing의 주요 컴포넌트들은 다음과 같은 방식으로 Composite Pattern을 구현
    • Component: 모든 Swing 컴포넌트의 기본 클래스이며 해당 클래스는 개별 컴포넌트와 복합 컴포넌트가 공통으로 구현해야 하는 메서드를 정의
    • Leaf: JButton, JLabel, JTextField 등과 같은 실제 UI 요소들로, 개별적으로 동작
    • Composite: JPanel, JFrame 등과 같이 다른 컴포넌트들을 포함할 수 있는 복합 요소


 

참고

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님

반응형