๊ด€๋ฆฌ ๋ฉ”๋‰ด

<Hello Hosung๐Ÿ˜Ž/>

[Java] ๋””์ž์ธ ํŒจํ„ด ๋ณธ๋ฌธ

๐Ÿ’ป Java/ใ…คJava(Basic)

[Java] ๋””์ž์ธ ํŒจํ„ด

์ขŒ์ถฉ์šฐ๋Œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ผ๊ธฐ๐Ÿง 2024. 11. 14. 23:25

๋””์ž์ธ ํŒจํ„ด์ด๋ž€ ?

๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋””์ž์ธ ํŒจํ„ด์€ ํŠน์ •ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ ๊ฒ€์ฆ๋œ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋””์ž์ธ ํŒจํ„ด์˜ ๋ถ„๋ฅ˜

๋””์ž์ธ ํŒจํ„ด์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๋ฒ”์ฃผ๋กœ ๋‚˜๋ˆ ์ง‘๋‹ˆ๋‹ค:

์ƒ์„ฑ ํŒจํ„ด (Creational Patterns): ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ด€๋ จ๋œ ํŒจํ„ด
๊ตฌ์กฐ์  ํŒจํ„ด (Structural Patterns): ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ๊ด€๊ณ„๋ฅผ ์กฐ์งํ•˜๋Š” ํŒจํ„ด
ํ–‰๋™ ํŒจํ„ด (Behavioral Patterns): ๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ๊ณผ ์ฑ…์ž„์„ ์ •์˜ํ•˜๋Š” ํŒจํ„ด
 


์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฐ” ๋””์ž์ธ ํŒจํ„ด

(1) ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด (Singleton Pattern)

๋ชฉ์ : ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋„๋ก ๋ณด์žฅํ•˜๊ณ , ์ „์—ญ ์ ‘๊ทผ์ ์„ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด.
์‚ฌ์šฉ ์˜ˆ์‹œ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ์„ค์ • ํด๋ž˜์Šค ๋“ฑ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ.
 

public class Singleton {
    private static Singleton instance;

    private Singleton() { }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 
 
(2) ํŒฉํ† ๋ฆฌ ํŒจํ„ด (Factory Pattern)

๋ชฉ์ : ๊ฐ์ฒด ์ƒ์„ฑ์„ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ฒฐ์ •ํ•˜๊ฒŒ ํ•˜์—ฌ, ๊ฐ์ฒด ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ์บก์Аํ™”ํ•˜๋Š” ํŒจํ„ด.
์‚ฌ์šฉ ์˜ˆ์‹œ: ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ •์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด ์œ ํ˜•์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋  ๋•Œ ์œ ์šฉ.

public interface Animal {
    void speak();
}

public class Dog implements Animal {
    public void speak() {
        System.out.println("Woof!");
    }
}

public class Cat implements Animal {
    public void speak() {
        System.out.println("Meow!");
    }
}

public class AnimalFactory {
    public static Animal getAnimal(String type) {
        if ("dog".equalsIgnoreCase(type)) {
            return new Dog();
        } else if ("cat".equalsIgnoreCase(type)) {
            return new Cat();
        }
        return null;
    }
}

 

(3) ์˜ต์ €๋ฒ„ ํŒจํ„ด (Observer Pattern)

๋ชฉ์ : ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”์— ๋Œ€ํ•ด ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์— ์ž๋™์œผ๋กœ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ํŒจํ„ด.
์‚ฌ์šฉ ์˜ˆ์‹œ: ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ, GUI์—์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์—…๋ฐ์ดํŠธ ๋“ฑ.
 

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

interface Observer {
    void update(String message);
}

class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}



(4) ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด (Strategy Pattern)

๋ชฉ์ : ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํด๋ž˜์Šค์— ์บก์Аํ™”ํ•˜์—ฌ ๋™์ ์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŒจํ„ด.
์‚ฌ์šฉ ์˜ˆ์‹œ: ๊ณ„์‚ฐ๊ธฐ ํ”„๋กœ๊ทธ๋žจ, ์ •๋ ฌ ๋ฐฉ์‹ ์„ ํƒ ๋“ฑ.

public interface Strategy {
    int execute(int a, int b);
}

class AddStrategy implements Strategy {
    public int execute(int a, int b) {
        return a + b;
    }
}

class SubtractStrategy implements Strategy {
    public int execute(int a, int b) {
        return a - b;
    }
}

class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }
}

 

๋””์ž์ธ ํŒจํ„ด์˜ ์žฅ์ 

 
์žฌ์‚ฌ์šฉ์„ฑ: ์ด๋ฏธ ๊ฒ€์ฆ๋œ ํ•ด๊ฒฐ์ฑ…์„ ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์œ ์ง€๋ณด์ˆ˜์„ฑ: ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ์กฐํ™”๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
์œ ์—ฐ์„ฑ: ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 
 

๋งˆ๋ฌด๋ฆฌ

์ž๋ฐ” ๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋””์ž์ธ ํŒจํ„ด์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด, ๋” ๊น”๋”ํ•˜๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํŒจํ„ด์˜ ํŠน์ง•์„ ์ž˜ ์ดํ•ดํ•˜๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์ ์ ˆํžˆ ํ™œ์šฉํ•ด ๋ณด์„ธ์š”.

์ด์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด ๋…์ž๋“ค์ด ๋””์ž์ธ ํŒจํ„ด์„ ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ํŒจํ„ด์˜ ๋ชฉ์ ๊ณผ ์‚ฌ์šฉ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.