ํ•ฉ์„ฑ (Composite) ํŒจํ„ด

2 minute read

๐Ÿ”— ํ•ฉ์„ฑ (Composite) ํŒจํ„ด์ด๋ž€?

  • ๊ฐ์ฒด๋“ค์˜ ๊ด€๊ณ„๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์ „์ฒด-๋ถ€๋ถ„ ๊ณ„์ธต์„ ํ‘œํ˜„ํ•˜๋Š” ํŒจํ„ด์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋ณตํ•ฉ ๊ฐ์ฒด์™€ ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ตฌ๋ณ„ ์—†์ด ๋‹ค๋ฃจ๊ฒŒ ํ•œ๋‹ค.

  • ์ฆ‰, ์ „์ฒด-๋ถ€๋ถ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

    • ํด๋ผ์ด์–ธํŠธ๋Š” ์ „์ฒด์™€ ๋ถ€๋ถ„์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’Ž ํ•ฉ์„ฑ ํŒจํ„ด์˜ ๊ตฌ์„ฑ ์š”์†Œ
  • Base Component

    • ๋ฒ ์ด์Šค ์ปดํผ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ composition๋‚ด์˜ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•œ๋‹ค.

    • ๋ฒ ์ด์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ •์˜๋˜๋ฉฐ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋“ค์—๊ฒŒ ๊ณตํ†ต๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • Leaf

    • composition ๋‚ด ์˜ค๋ธŒ์ ํŠธ๋“ค์˜ ํ–‰๋™์„ ์ •์˜ํ•œ๋‹ค.

    • ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋กœ ๋‹จ์ผ ๊ฐ์ฒด[Base Component]๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

    • Leaf๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉด ์•ˆ๋œ๋‹ค.

  • Composite

    • ๋ณตํ•ฉ ๊ฐ์ฒด ๊ทธ๋ฃน์„ ํ‘œํ˜„ํ•  ํด๋ž˜์Šค๋กœ ์ „์ฒด ํด๋ž˜์Šค์ด๋‹ค.
      • ์—ญ์‹œ ๋‹จ์ผ ๊ฐ์ฒด[Base Component]๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
    • Leaf ๊ฐ์ฒด๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ๋ฒ ์ด์Šค ์ปดํผ๋„ŒํŠธ ๋‚ด ๋ช…๋ น๋“ค์„ ๊ตฌํ˜„ํ•œ๋‹ค.

๐Ÿ’Ž BaseComponent - Leaf์™€ Composite์˜ ๊ณตํ†ต๋˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์„ ์ •์˜

  • Shape.java - ๋„ํ˜•์„ ๊ทธ๋ฆฌ๋Š” draw ๋ฉ”์†Œ๋“œ ์ •์˜
package StructurePattern.CompositPattern;

/**
 * Base Component - ๋ฒ ์ด์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ composition ๋‚ด์˜ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
 * ๋ฒ ์ด์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ •์˜๋˜๋ฉฐ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋“ค์—๊ฒŒ ๊ณตํ†ต๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 */
public interface Shape {
    public void draw(String fillColor);
}


๐Ÿ’Ž Leaf Objects - Leaf ๊ฐ์ฒด๋“ค์€ ๋ณตํ•ฉ์ฒด์— ํฌํ•จ๋˜๋Š” ์š”์†Œ๋กœ, Base Component๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

  • Traingle.java
package StructurePattern.CompositPattern;

/*
Leaf ๊ฐ์ฒด๋“ค์€ ๋ณตํ•ฉ์ฒด์— ํฌํ•จ๋˜๋Š” ์š”์†Œ๋กœ, Base Component๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 */
public class Triangle implements Shape {

    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Triangle with color : " + fillColor);
    }
}
  • Circle.java
package StructurePattern.CompositPattern;

/*
Leaf ๊ฐ์ฒด๋“ค์€ ๋ณตํ•ฉ์ฒด์— ํฌํ•จ๋˜๋Š” ์š”์†Œ๋กœ, Base Component๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 */
public class Circle implements Shape {

    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Circle with color : " + fillColor);
    }
}

๐Ÿ’Ž Composite Objects - Composite ๊ฐ์ฒด๋Š” Leaf ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋ฉฐ, Base Component๋ฅผ ๊ตฌํ˜„

  • Drawing.java
package StructurePattern.CompositPattern;

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

/*
Composite ๊ฐ์ฒด๋Š” Leaf ๊ฐ์ฒด๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,
Base Component๋ฅผ ๊ตฌํ˜„ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Leaf ๊ทธ๋ฃน์— ๋Œ€ํ•ด add์™€ remove๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋“ค์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
 */
public class Drawing implements Shape {
    private List<Shape> shapeList = new ArrayList<>();

    @Override
    public void draw(String fillColor) {
        for ( Shape oneShape : shapeList ) {
            oneShape.draw(fillColor);
        }
    }

    public void add(Shape s) {
        shapeList.add(s);
    }

    public void remove(Shape s) {
        shapeList.remove(s);
    }

    public void clear() {
        System.out.println("Clearing all the shapes form drawing");
        this.shapeList.clear();
    }
}

๐Ÿ’Ž Test ์ฝ”๋“œ

  • TestCompositePattern.java
package StructurePattern.CompositPattern;

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

/*
๊ตฌ์กฐ ํŒจํ„ด์ด๋ž€ ์ž‘์€ ํด๋ž˜์Šค๋“ค์„ ์ƒ์†๊ณผ ํ•ฉ์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋” ํฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งˆ์น˜ ํ•˜๋‚˜์ธ ์–‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜, ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•ฉ์„ฑ(Composite)ํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์˜ ํ†ต์ผ๋œ ์ถ”์ƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ ํŒจํ„ด์˜ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๊ตฌํ˜„์„ ๋ณตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๋ฅผ ํ•ฉ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ๊ฐ€ ์•„๋‹Œ ๋Ÿฐํƒ€์ž„ ๋‹จ๊ณ„์—์„œ ๋ณตํ•ฉ ๋ฐฉ๋ฒ•์ด๋‚˜ ๋Œ€์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์œ ์—ฐ์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
 */
public class TestCompositePattern {
    public static void main(String[] args) {
        Triangle triangle = new Triangle();
        Triangle triangle1 = new Triangle();
        Circle circle = new Circle();

        Drawing drawing = new Drawing();
        drawing.add(triangle);
        drawing.add(triangle1);
        drawing.add(circle);

        drawing.draw("Red");

        System.out.println("==========================================");
        List<Shape> shapes = new ArrayList<>();
        shapes.add(drawing);
        shapes.add(new Triangle());
        shapes.add(new Circle());

        for (Shape shape : shapes) {
            shape.draw("Green");
        }
    }
}
  • drawing - Composite[์ „์ฒด] ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด Triangle, Circle ๋“ฑ์˜ Leaf[๋ถ€๋ถ„] ๊ฐ์ฒด๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ํ•œ๋ฒˆ์— ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋˜ํ•œ drawing ๊ฐ์ฒด ๋˜ํ•œ ๋‹ค๋ฅธ ๋„ํ˜•๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Shape ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋–„๋ฌธ์— drawing์ด ๋‹ค๋ฅธ ๋„ํ˜•๋“ค๊ณผ ํ•จ๊ป˜ ์ทจ๊ธ‰ ๋  ์ˆ˜์žˆ๋‹ค.

  • ์ฆ‰, ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„  ์ „์ฒด[Composite]์™€ ๋ถ€๋ถ„[Leaf] ์˜ ๊ตฌ๋ณ„ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’Ž ์‹คํ–‰ ๊ฒฐ๊ณผ

Drawing Triangle with color : Red
Drawing Triangle with color : Red
Drawing Circle with color : Red
==========================================
Drawing Triangle with color : Green
Drawing Triangle with color : Green
Drawing Circle with color : Green
Drawing Triangle with color : Green
Drawing Circle with color : Green

Comments