Search

์ปดํฌ์ง€ํŠธ ํŒจํ„ด

์ปดํฌ์ง€ํŠธ ํŒจํ„ด (Composite Pattern)

์ปดํฌ์ง€ํŠธ ํŒจํ„ด์€ ๊ฐœ๋ณ„ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ์  ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋œ ๋ถ€๋ถ„-์ „์ฒด ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐœ๋ณ„ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๊ท ์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
๊ฐ์ฒด๋“ค์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋ถ€๋ถ„-์ „์ฒด ๊ณ„์ธต์„ ํ‘œํ˜„
โ€ข
๋‹จ์ผ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฒ˜๋ฆฌ
โ€ข
ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๊ฐ์ฒด ๊ตฌ์กฐ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€

ํŠน์ง•

โ€ข
์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
โ€ข
Component, Leaf, Composite ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ
โ€ข
ํ™•์žฅ์„ฑ์ด ์ข‹๊ณ  ๊ฐ์ฒด ์ถ”๊ฐ€๊ฐ€ ์šฉ์ดํ•จ
โ€ข
ํƒ€์ž… ์•ˆ์ •์„ฑ ํ™•๋ณด๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ

์˜ˆ์‹œ ์ฝ”๋“œ

// Component interface FileComponent { void showInfo(); } // Leaf class File implements FileComponent { private String name; public File(String name) { this.name = name; } public void showInfo() { System.out.println("File: " + name); } } // Composite class Directory implements FileComponent { private String name; private List<FileComponent> components = new ArrayList<>(); public Directory(String name) { this.name = name; } public void add(FileComponent component) { components.add(component); } public void showInfo() { System.out.println("Directory: " + name); for(FileComponent component : components) { component.showInfo(); } } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•œ ์ปดํฌ์ง€ํŠธ ํŒจํ„ด์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:
โ€ข
FileComponent (Component): ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. showInfo() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
โ€ข
File (Leaf): ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๋กœ, ๋ง๋‹จ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์„ ์ €์žฅํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Directory (Composite): ์—ฌ๋Ÿฌ FileComponent๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ๊ณผ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ํŒŒ์ผ๊ณผ ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™œ์šฉ ์˜ˆ์‹œ

public class Main { public static void main(String[] args) { Directory root = new Directory("๋ฃจํŠธ"); Directory docs = new Directory("๋ฌธ์„œ"); File file1 = new File("report.txt"); File file2 = new File("image.jpg"); docs.add(file1); root.add(docs); root.add(file2); root.showInfo(); // ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ํ‘œ์‹œ } }
Java
๋ณต์‚ฌ