
๊ฐ์ฒด๋ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ์กฐํฉ๋๊ณ ์ํธ์์ฉํ๋์ง,
์์คํ ๋ด์์ ๊ตฌ์กฐ์ ์ผ๋ก ์ด๋ป๊ฒ ์ค๊ณ๋์ด์ผ ํ๋์ง๋ฅผ ๋ค๋ฃจ๋ ํจํด
์ด๋ํฐ ํจํด: ์๋ก ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ค์ ์ฐ๊ฒฐํด์ฃผ๋ ํจํด์ผ๋ก,
ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํจ.
ํธํ์ฑ ์ ๊ณต: ๊ธฐ์กด ์ธํฐํ์ด์ค๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ ๊ฐ๋ฅ.
์ ์ฐ์ฑ: ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ธ๋ถ ์ฝ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํฉํ ์ ์์.
์ฌ์ฌ์ฉ์ฑ: ๊ธฐ์กด ์ฝ๋๋ฅผ ์ด๋ํฐ๋ฅผ ํตํด ์ฌ์ฌ์ฉํ ์ ์์.
๋ณต์ก์ฑ ์ฆ๊ฐ: ๋ง์ ์ด๋ํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์.
์ฑ๋ฅ ๋ฌธ์ : ์ธํฐํ์ด์ค ๋ณํ ์์ ์ผ๋ก ์ธํด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์.
ํ๋ก์ ํจํด: ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ธฐ ์ํด ๋๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํจํด์ผ๋ก, ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ ํ์ฌ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ฑฐ๋ ์ ๊ทผ์ ์ ์ดํจ.
์ ๊ทผ ์ ์ด: ์ค์ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ์ฌ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํจ (์ง์ฐ ๋ก๋ฉ).
๋ถ๊ฐ ๊ธฐ๋ฅ ์ ๊ณต: ์ค์ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋, ๋ก๊น ๋ฐ ์บ์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์.
๋ณด์์ฑ ํฅ์: ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ๋ณดํธํ ์ ์์.
๋ณต์ก์ฑ ์ฆ๊ฐ: ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ถ๊ฐ๋๋ฉด์ ์์คํ ์ด ๋ณต์กํด์ง ์ ์์.
์ฑ๋ฅ ์ ํ: ํ๋ก์๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์.
์ปดํฌ์งํธ ํจํด: ๊ฐ์ฒด๋ค์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ์ฌ, ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ํ๋ ํจํด์.
์ผ๊ด๋ ์ฒ๋ฆฌ: ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์.
์ ์ฐ์ฑ: ๋ณตํฉ ๊ฐ์ฒด ๋ด์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ ๋กญ๊ฒ ์ถ๊ฐํ์ฌ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ.
์ฌ๊ท์ ๊ตฌ์กฐ: ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ํจํด.
๋ณต์ก์ฑ ์ฆ๊ฐ: ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๊น์ด์ง์๋ก ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง ์ ์์.
์ฑ๋ฅ ๋ฌธ์ : ํธ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฐ ์๊ฐ์ด ๋ง์ด ์์๋ ์ ์์.
// Component (๊ณตํต ์ธํฐํ์ด์ค)
interface FileSystemComponent {
void showDetails();
}
// Leaf (ํ์ผ: ๊ฐ๋ณ ๊ฐ์ฒด)
class File implements FileSystemComponent {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void showDetails() {
System.out.println("File: " + 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);
}
@Override
public void showDetails() {
System.out.println("Folder: " + name);
for (FileSystemComponent component : components) {
component.showDetails();
}
}
}
// ์ฌ์ฉ ์์
public class CompositePatternExample {
public static void main(String[] args) {
File file1 = new File("file1.txt");
File file2 = new File("file2.txt");
Folder folder1 = new Folder("Documents");
folder1.addComponent(file1);
folder1.addComponent(file2);
Folder rootFolder = new Folder("Root");
rootFolder.addComponent(folder1);
// Root ํด๋์ ๊ทธ ์์ ๊ตฌ์ฑ์์๋ฅผ ์ถ๋ ฅ
rootFolder.showDetails();
}
}
//Folder: Root
//Folder: Documents
//File: file1.txt
//File: file2.txt
๋ ธ์ถ ๋ชจ๋ ํจํด: ๋ชจ๋์ ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ฉ์๋๋ฅผ ์จ๊ธฐ๊ณ , ์ธ๋ถ์์ ์ฌ์ฉํ ๋ถ๋ถ๋ง ๋ช ์์ ์ผ๋ก ๋ ธ์ถํ๋ ํจํด์ผ๋ก, ์ฃผ๋ก JavaScript์์ ์ฌ์ฉ๋จ.
์บก์ํ: ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ฉ์๋๋ฅผ ์จ๊ธฐ๊ณ , ํ์ํ ๋ถ๋ถ๋ง ๋ ธ์ถํด ์์ ํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ.
์ ์ฐ์ฑ: ์ธ๋ถ๋ก ๋ ธ์ถํ ๋ถ๋ถ์ ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์.
์ ์ญ ๋ณ์ ์ค์ผ ๋ฐฉ์ง: ํด๋ก์ ๋ฅผ ์ฌ์ฉํด ์ ์ญ ์ค์ฝํ๋ฅผ ์ค์ผ์ํค์ง ์์.
ํ ์คํธ ์ด๋ ค์: ๋ด๋ถ์ ์จ๊ฒจ์ง ๋ฉ์๋๋ ํ ์คํธํ๊ธฐ ์ด๋ ค์ธ ์ ์์.
์์กด์ฑ ๊ด๋ฆฌ: ๋ง์ ์์กด์ฑ์ด ํ์ํ ๋ ๋ณต์กํด์ง ์ ์์.
public, private, protected ...