ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 복합체 패턴(Composite Pattern)이란?
    Design Pattern/구조 디자인 패턴 2024. 4. 14. 16:16
    반응형

     복합체 패턴(Composite Pattern)은 클라이언트가 개별 객체와 복합 객체 모두를 동일하게 다룰 수 있도록 하는 구조적 디자인 패턴입니다. 이 패턴은 객체를 트리 구조로 구성하여 부분-전체 계층을 표현합니다. 이를 통해 클라이언트는 개별 객체와 복합 객체를 동일한 방법으로 처리할 수 있습니다. 가장 쉽게 폴더를 이해하면 좋습니다.

    1. 복합체 패턴은 주로 어디에 쓰이나?

    복합체 패턴은 파일 시스템의 디렉토리와 파일 관리, 사용자 인터페이스 컴포넌트, 메뉴 시스템 등과 같이 부분과 전체의 계층 구조가 명확한 시스템에서 널리 사용됩니다. 예를 들어, 메뉴와 서브메뉴 항목을 동일한 객체 인터페이스로 다루어 개발의 복잡성을 줄일 수 있습니다.

    2. Java와 Go로 복합체 패턴을 구현할 때의 차이점

    • Java: Java에서 복합체 패턴은 클래스와 인터페이스를 통해 구현됩니다. 인터페이스는 공통의 메서드를 정의하고, 각 노드와 잎 클래스는 이 인터페이스를 구현하여 트리 구조를 형성합니다.
    • Go: Go에서는 인터페이스와 구조체를 사용합니다. 인터페이스는 트리 구조 내의 모든 요소가 가져야 할 메서드를 정의하고, 구조체는 이 인터페이스를 구현합니다. Go의 인터페이스 구현은 명시적이지 않아 유연성이 더 높습니다.

    3. 복합체 패턴 예시 (Java, Golang)

    Java 예시 코드:

    interface Component {
        void operation();
    }
    
    class Leaf implements Component {
        public void operation() {
            System.out.println("Leaf operation");
        }
    }
    
    class Composite implements Component {
        private List<Component> children = new ArrayList<>();
    
        public void add(Component component) {
            children.add(component);
        }
    
        public void operation() {
            for (Component child : children) {
                child.operation();
            }
        }
    }

    Java에서 복합체 패턴을 사용하는 예는 Component 인터페이스, Leaf 클래스, 그리고 Composite 클래스를 포함합니다.

    1. Component 인터페이스:
      • 모든 컴포넌트(잎 노드와 복합 노드 모두)가 구현해야 하는 공통 동작을 정의합니다.
      • 여기서는 operation() 메서드가 모든 컴포넌트가 수행해야 할 작업을 추상화합니다.
    2. Leaf 클래스:
      • Component 인터페이스를 구현하여 간단한 동작을 수행합니다. 이 경우는 "Leaf operation"이라는 메시지를 출력합니다.
      • 이는 가장 기본적인 동작 단위로서, 복합 객체의 일부분을 나타냅니다.
    3. Composite 클래스:
      • 복합 노드를 나타내며, 자식 컴포넌트 목록을 유지합니다.
      • add() 메서드를 통해 자식 컴포넌트를 추가할 수 있습니다.
      • operation() 메서드는 복합 객체가 포함하는 모든 자식 컴포넌트에 동일한 작업을 위임함으로써, 각 자식의 operation()을 호출합니다.

    Golang 예시 코드:

    type Component interface {
        Operation()
    }
    
    type Leaf struct{}
    
    func (l *Leaf) Operation() {
        fmt.Println("Leaf operation")
    }
    
    type Composite struct {
        children []Component
    }
    
    func (c *Composite) Add(child Component) {
        c.children = append(c.children, child)
    }
    
    func (c *Composite) Operation() {
        for _, child := range c.children {
            child.Operation()
        }
    }

    Golang에서는 인터페이스와 구조체를 사용하여 복합체 패턴을 구현합니다.

    1. Component 인터페이스:
      • Golang에서 Component 인터페이스는 Operation() 메서드를 정의하여, 모든 구성 요소가 공통적으로 수행할 작업을 명시합니다.
    2. Leaf 구조체:
      • Leaf는 간단한 컴포넌트로서, Operation() 메서드에서는 "Leaf operation"이라고 출력합니다.
      • 이는 개별적인 동작을 나타내며, 복합 객체의 일부로 작동할 수 있습니다.
    3. Composite 구조체:
      • 복합 객체를 나타내는 Composite 구조체는 내부에 Component 인터페이스를 구현하는 여러 자식을 가질 수 있는 children 슬라이스를 포함합니다.
      • Add() 메서드를 통해 새로운 자식 컴포넌트를 추가합니다.
      • Operation() 메서드는 모든 자식 컴포넌트의 Operation() 메서드를 순차적으로 호출하여, 트리 구조에서의 계층적 동작을 구현합니다.

     이 두 언어의 예시에서 복합체 패턴의 핵심은 클라이언트가 개별 객체와 복합 객체를 구분 없이 동일한 방법으로 처리할 수 있도록 하는 것입니다. 이러한 일관성은 코드의 유연성을 증가시키고, 복잡한 객체 구조를 쉽게 관리할 수 있게 합니다.

    4. 복합체 패턴의 장단점

    장점:

    • 투명성: 클라이언트는 개별 객체와 복합 객체를 구분하지 않고 동일한 방식으로 다룰 수 있습니다.
    • 단순성: 클라이언트 코드를 단순화할 수 있으며, 새로운 종류의 요소를 추가하기 쉽습니다.

    단점:

    • 과도한 일반화: 일부 경우에는 특정 컴포넌트에 특정 동작만 필요할 수 있지만, 복합체 패턴을 사용하면 불필요한 인터페이스 구현을 강제할 수 있습니다.
    • 디자인의 복잡성: 초기 설계에서 패턴을 올바르게 적용하기 위해 충분한 고려가 필요합니다. 잘못 설계된 복합체 패턴은 시스템을 불필요하게 복잡하게 만들 수 있습니다.

     

    반응형
Designed by Tistory.