본문 바로가기
CS(Computer Science)지식/[C++] 디자인 패턴

복합체 패턴(Composite Pattern) 이해하기 : 쉽게 설명한 디자인 패턴(C++)

by 엔지니어 청년 2024. 1. 28.

1. 복합체 패턴이란?

복합체 패턴은 객체들의 그룹을 단일 객체처럼 다룰 수 있게 해주는 구조적 디자인 패턴입니다. 이 패턴을 사용하면, 클라이언트는 개별 객체와 복합 객체를 동일하게 취급할 수 있습니다.

2. 복합체 패턴의 구조

복합체 패턴은 다음과 같은 세 가지 주요 구성 요소로 이루어져 있습니다.

  1. Component: 모든 구성 요소에 공통인 인터페이스를 정의합니다.
  2. Leaf: 개별 객체를 나타내는 클래스입니다.
  3. Composite: 구성 요소의 그룹을 나타내는 클래스입니다.

3. 복합체 패턴의 예시

이제 C++를 사용하여 복합체 패턴을 어떻게 구현하는지 살펴보겠습니다. 여기서는 파일 시스템의 예제를 사용하겠습니다.

#include <iostream>
#include <vector>
#include <memory>


// Component
class FileComponent
 {
public:
    virtual ~FileComponent() = default;
    virtual void show() const = 0;
};

// Leaf
class File : public FileComponent
 {
public:
    File(const std::string& name) : name(name) {}
    void show() const override {
        std::cout << "File: " << name << std::endl;
    }

private:
    std::string name;
};

// Composite
class Directory : public FileComponent 
{
public:
    Directory(const std::string& name) : name(name) {}
    void add(std::unique_ptr<FileComponent> component) {
        components.push_back(std::move(component));
    }
    void show() const override {
        std::cout << "Directory: " << name << std::endl;
        for (const auto& component : components) {
            component->show();
        }
    }

private:
    std::string name;
    std::vector<std::unique_ptr<FileComponent>> components;
};

int main() 
{
    Directory root("root");
    root.add(std::make_unique<File>("file1"));
    root.add(std::make_unique<File>("file2"));

    Directory subDirectory("sub");
    subDirectory.add(std::make_unique<File>("file3"));
    root.add(std::make_unique<Directory>(std::move(subDirectory)));

    root.show();
    // Output:
    // Directory: root
    // File: file1
    // File: file2
    // Directory: sub
    // File: file3

    return 0;
}

위의 코드에서 FileComponent 인터페이스는 파일과 디렉토리가 공통으로 가져야 하는 show 메서드를 정의합니다. File 클래스는 개별 파일을, Directory 클래스는 파일과 다른 디렉토리의 그룹을 나타냅니다.


4. 결론

복합체 패턴은 객체들의 그룹을 단일 객체처럼 다룰 수 있게 해주는 구조적 디자인 패턴입니다. 이 패턴을 이해하고 사용하면, 코드의 유연성을 높이고, 클라이언트 코드를 단순화할 수 있습니다.