개발/자바

[java] 컴포지트(Composite) 패턴

조용한닭 2024. 1. 12. 09:04
728x90
반응형

컴포지트 패턴은 객체들을 트리 구조로 구성하여 개별 객체와 복합 객체(객체들의 그룹)를 동일한 방법으로 다룰 수 있게 하는 구조적인 디자인 패턴입니다. 이 패턴은 객체들 간의 계층 구조를 표현하고, 클라이언트가 개별 객체와 복합 객체를 구분하지 않고 사용할 수 있도록 합니다.

장점

  1. 일관된 인터페이스: 개별 객체와 복합 객체를 동일한 방식으로 처리할 수 있어 코드를 단순화하고 일관성을 유지합니다.
  2. 계층 구조: 객체들 간의 계층 구조를 표현하여 복잡한 관계를 간단하게 모델링할 수 있습니다.
  3. 재귀적 구조: 복합 객체 내에 다른 복합 객체를 포함할 수 있어 계층 구조를 재귀적으로 표현할 수 있습니다.
  4. 클라이언트 코드 간소화: 클라이언트 코드가 개별 객체와 복합 객체를 구분하지 않고 동일한 인터페이스로 처리할 수 있으므로 코드가 간소화됩니다.

단점

  1. 복잡성: 컴포지트 패턴을 구현하기 위한 추가적인 추상화와 코드 구조가 필요할 수 있으므로 초기 구현에는 다소 복잡할 수 있습니다.
  2. 성능: 복합 객체 내에 수많은 자식 객체가 있을 경우 성능 저하가 발생할 수 있습니다.

사용 예시

컴포지트 패턴은 파일 시스템, 그래픽 계층 구조, 조직도와 같이 계층 구조를 가지는 구조를 모델링할 때 주로 사용됩니다. 예를 들어, 파일 시스템에서 폴더와 파일을 모두 동일한 방식으로 다룰 수 있습니다.

자바 예시 코드

다음은 컴포지트 패턴을 사용하여 파일 시스템을 모델링한 간단한 자바 예시 코드입니다.

import java.util.ArrayList;
import java.util.List;

// Component 인터페이스
interface FileSystemComponent {
    void display();
}

// Leaf 클래스: 파일을 나타내는 클래스
class File implements FileSystemComponent {
    private String name;

    public File(String name) {
        this.name = name;
    }

    public void display() {
        System.out.println("파일: " + name);
    }
}

// Composite 클래스: 폴더를 나타내는 클래스
class Folder implements FileSystemComponent {
    private String name;
    private List<FileSystemComponent> components = new ArrayList<>();

    public Folder(String name) {
        this.name = name;
    }

    public void addComponent(FileSystemComponent component) {
        components.add(component);
    }

    public void display() {
        System.out.println("폴더: " + name);
        for (FileSystemComponent component : components) {
            component.display();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // 파일 시스템 생성
        Folder root = new Folder("루트");
        Folder folder1 = new Folder("폴더 1");
        File file1 = new File("파일 1.txt");
        File file2 = new File("파일 2.txt");

        // 파일 시스템 구조 구성
        root.addComponent(folder1);
        folder1.addComponent(file1);
        folder1.addComponent(file2);

        // 파일 시스템 출력
        root.display();
    }
}

코드 설명

  • FileSystemComponent 인터페이스는 display 메서드를 정의하여 모든 컴포넌트에 공통의 인터페이스를 제공합니다.
  • File 클래스와 Folder 클래스는 각각 파일과 폴더를 나타내며 display 메서드를 구현합니다.
  • Folder 클래스는 다른 컴포넌트들을 추가할 수 있는 컨테이너 역할을 합니다.
  • Main 클래스에서 파일 시스템을 구성하고 출력합니다.

이 코드에서 Folder는 복합 객체로, 다른 파일과 폴더를 포함할 수 있습니다. 클라이언트 코드에서는 파일과 폴더를 동일한 방식으로 다룰 수 있으며, 복잡한 파일 시스템을 효과적으로 모델링할 수 있습니다.

 
 
 
 
728x90
반응형