๐Ÿ“š Design Pattern - 3

kkmdevelยท2024๋…„ 10์›” 11์ผ

DesignPattern

๋ชฉ๋ก ๋ณด๊ธฐ
3/4

๐Ÿ“˜ ๊ตฌ์กฐ ํŒจํ„ด (Structural Patterns)

๊ฐ์ฒด๋‚˜ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ์กฐํ•ฉ๋˜๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€,
์‹œ์Šคํ…œ ๋‚ด์—์„œ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ํŒจํ„ด

๐Ÿ“„ ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด (Adapter Pattern)

์–ด๋Œ‘ํ„ฐ ํŒจํ„ด: ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํŒจํ„ด์œผ๋กœ,
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ.

์žฅ์  ๋ฐ ์‚ฌ์šฉ ์ด์œ 

  • ํ˜ธํ™˜์„ฑ ์ œ๊ณต: ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ.

  • ์œ ์—ฐ์„ฑ: ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์™ธ๋ถ€ ์ฝ”๋“œ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Œ.

  • ์žฌ์‚ฌ์šฉ์„ฑ: ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์–ด๋Œ‘ํ„ฐ๋ฅผ ํ†ตํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

๋‹จ์ 

  • ๋ณต์žก์„ฑ ์ฆ๊ฐ€: ๋งŽ์€ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ, ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ.

  • ์„ฑ๋Šฅ ๋ฌธ์ œ: ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€ํ™˜ ์ž‘์—…์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ.

๐Ÿ“„ ํ”„๋ก์‹œ ํŒจํ„ด (Proxy Pattern)

ํ”„๋ก์‹œ ํŒจํ„ด: ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋ฆฌ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์œผ๋กœ, ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ ‘๊ทผ์„ ์ œ์–ดํ•จ.

์žฅ์  ๋ฐ ์‚ฌ์šฉ ์ด์œ 

  • ์ ‘๊ทผ ์ œ์–ด: ์‹ค์ œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•จ (์ง€์—ฐ ๋กœ๋”ฉ).

  • ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ œ๊ณต: ์‹ค์ œ ๊ฐ์ฒด์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋กœ๊น… ๋ฐ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ.

  • ๋ณด์•ˆ์„ฑ ํ–ฅ์ƒ: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Œ.

๋‹จ์ 

  • ๋ณต์žก์„ฑ ์ฆ๊ฐ€: ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ ์‹œ์Šคํ…œ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ.

  • ์„ฑ๋Šฅ ์ €ํ•˜: ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ.

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

์ปดํฌ์ง€ํŠธ ํŒจํ„ด: ๊ฐ์ฒด๋“ค์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ, ๊ฐœ๋ณ„ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ž„.

์žฅ์  ๋ฐ ์‚ฌ์šฉ ์ด์œ 

  • ์ผ๊ด€๋œ ์ฒ˜๋ฆฌ: ๊ฐœ๋ณ„ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

  • ์œ ์—ฐ์„ฑ: ๋ณตํ•ฉ ๊ฐ์ฒด ๋‚ด์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ.

  • ์žฌ๊ท€์  ๊ตฌ์กฐ: ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด.

๋‹จ์ 

  • ๋ณต์žก์„ฑ ์ฆ๊ฐ€: ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๊นŠ์–ด์งˆ์ˆ˜๋ก ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ.

  • ์„ฑ๋Šฅ ๋ฌธ์ œ: ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Œ.

์˜ˆ์‹œ

// 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

๐Ÿ“„ ๋…ธ์ถœ ๋ชจ๋“ˆ ํŒจํ„ด (Revealing Module Pattern)

๋…ธ์ถœ ๋ชจ๋“ˆ ํŒจํ„ด: ๋ชจ๋“ˆ์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆจ๊ธฐ๊ณ , ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ๋ถ€๋ถ„๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” ํŒจํ„ด์œผ๋กœ, ์ฃผ๋กœ JavaScript์—์„œ ์‚ฌ์šฉ๋จ.

์žฅ์  ๋ฐ ์‚ฌ์šฉ ์ด์œ 

  • ์บก์Аํ™”: ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆจ๊ธฐ๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋…ธ์ถœํ•ด ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ.

  • ์œ ์—ฐ์„ฑ: ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•  ๋ถ€๋ถ„์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

  • ์ „์—ญ ๋ณ€์ˆ˜ ์˜ค์—ผ ๋ฐฉ์ง€: ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•ด ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š์Œ.

๋‹จ์ 

  • ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€: ๋‚ด๋ถ€์— ์ˆจ๊ฒจ์ง„ ๋ฉ”์†Œ๋“œ๋Š” ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ.

  • ์˜์กด์„ฑ ๊ด€๋ฆฌ: ๋งŽ์€ ์˜์กด์„ฑ์ด ํ•„์š”ํ•  ๋•Œ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ.

public, private, protected ...

profile
25/08/12

0๊ฐœ์˜ ๋Œ“๊ธ€