컴포지트 Composite
🙉

컴포지트 Composite

Created
Apr 24, 2024 04:17 AM
Last edited time
Last updated April 24, 2024
Tags
CS
Language
URL

Intro::

디자인 패턴중 구조 패턴인 컴포지트에 대해 알아봅시다.
 

컴포지트 패턴이란?

💡
컴포지트 패턴의 목적은 개별 객체와 객체의 집합을 트리 구조로 구성하여 클라이언트가 개별 객체와 집합을 동일하게 다룰 수 있도록 하는 것입니다. 즉, 클라이언트가 개별 객체와 그 객체들의 조합을 구분 없이 하나의 인터페이스를 통해 다룰 수 있게 해 줍니다. 컴포지트 패턴에서는 클래스의 공통적인 부분을 컴포넌트라고 하는 인터페이스 또는 추상 클래스로 정의하고, 이를 기반으로 하는 개별 객체(리프)와 이러한 객체들의 집합을 나타내는 컴포지트 클래스를 만듭니다.
 

구성 요소

  1. 컴포넌트(Component): 모든 개별 객체와 복합 객체가 공통으로 상속받는 인터페이스 또는 추상 클래스입니다. 공통의 작업을 정의합니다.
  1. 리프(Leaf): 컴포넌트 인터페이스를 구현하는 하위 클래스로, 컴포지트에서 가장 기본이 되는 객체를 나타냅니다. 다른 객체를 포함할 수 없습니다.
  1. 컴포지트(Composite): 컴포넌트 인터페이스를 구현하거나 상속하는 클래스로, 하위 컴포넌트들을 포함할 수 있습니다. 일반적으로 리스트나 배열 등을 사용하여 하위 컴포넌트들을 관리합니다.
 

장점

  • 투명성: 클라이언트는 개별 객체와 객체의 집합을 동일하게 취급할 수 있습니다. 이로 인해 코드의 일관성과 간결성이 유지됩니다.
  • 재사용성: 이미 구성된 구조를 쉽게 재사용하고, 확장할 수 있습니다. 새로운 종류의 컴포넌트를 추가하기 쉽습니다.
 

단점

  • 과도한 일반화: 모든 컴포넌트가 공통 인터페이스를 공유하기 때문에, 특정 컴포넌트에서만 의미 있는 메소드가 다른 컴포넌트에서도 노출될 수 있습니다. 이는 디자인을 혼란스럽게 만들 수 있습니다.
 

코드 예시

// 컴포넌트 인터페이스 interface Graphic { void draw(); } // 리프 컴포넌트 class Circle implements Graphic { public void draw() { System.out.println("원을 그립니다."); } } class Square implements Graphic { public void draw() { System.out.println("사각형을 그립니다."); } } // 컴포지트 컴포넌트 class CompositeGraphic implements Graphic { private List<Graphic> children = new ArrayList<>(); public void add(Graphic graphic) { children.add(graphic); } public void remove(Graphic graphic) { children.remove(graphic); } public void draw() { for (Graphic graphic : children) { graphic.draw(); // 컴포넌트의 draw 메소드 호출 } } } // 클라이언트 코드 public class Main { public static void main(String[] args) { Circle circle = new Circle(); Square square = new Square(); CompositeGraphic graphic = new CompositeGraphic(); graphic.add(circle); graphic.add(square); graphic.draw(); // "원을 그립니다." 그리고 "사각형을 그립니다." 출력 } }
 
 
 
 

References::

Loading Comments...