λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
IT

λ””μžμΈ νŒ¨ν„΄: μ†Œν”„νŠΈμ›¨μ–΄ 개발의 μ‹€μš©μ μΈ 해법

by πŸ’²πŸŽ΅βœ–οΈβœ”οΈβ˜Ό 2024. 2. 27.
728x90

λ””μžμΈ νŒ¨ν„΄: μ†Œν”„νŠΈμ›¨μ–΄ 개발의 μ‹€μš©μ μΈ 해법

1. λ””μžμΈ νŒ¨ν„΄μ΄λž€?

λ””μžμΈ νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ 자주 λ°œμƒν•˜λŠ” λ¬Έμ œμ— λŒ€ν•œ 효과적이고 κ²€μ¦λœ 해결책을 μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν˜•νƒœλ‘œ μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” μ†Œν”„νŠΈμ›¨μ–΄μ˜ ꡬ쑰화와 μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚€λŠ” 데 도움이 λ©λ‹ˆλ‹€.

2. λ””μžμΈ νŒ¨ν„΄μ˜ 유래

λ””μžμΈ νŒ¨ν„΄μ˜ κ°œλ…μ€ μ†Œν”„νŠΈμ›¨μ–΄ 곡학 λΆ„μ•Όλ‘œ 거슬러 μ˜¬λΌκ°‘λ‹ˆλ‹€. 1994년에 GoF(Gang of Four)라 λΆˆλ¦¬λŠ” λ„€ λͺ…μ˜ μ €μž(Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)κ°€ "Design Patterns: Elements of Reusable Object-Oriented Software"λΌλŠ” μ±…μ—μ„œ 처음 μ†Œκ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

3. λ””μžμΈ νŒ¨ν„΄μ˜ μ—­ν• 

  • ν•΄κ²°μ±… 제곡: 자주 λ°œμƒν•˜λŠ” λ¬Έμ œμ— λŒ€ν•œ ꡬ체적이고 κ²€μ¦λœ 해결책을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • μ½”λ“œ ꡬ쑰화: μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높이기 μœ„ν•΄ μΌμ •ν•œ ꡬ쑰λ₯Ό μ œμ‹œν•©λ‹ˆλ‹€.
  • μž¬μ‚¬μš©μ„± 증가: 이미 κ²€μ¦λœ νŒ¨ν„΄μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨ κ°œλ°œμžλ“€μ€ 효율적으둜 μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. λ””μžμΈ νŒ¨ν„΄μ˜ μ‚¬μš© 상황

λ””μžμΈ νŒ¨ν„΄μ€ 주둜 λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€:

  • μœ μ‚¬ν•œ λ¬Έμ œκ°€ 반볡적으둜 λ°œμƒν•  λ•Œ: λΉ„μŠ·ν•œ μœ ν˜•μ˜ λ¬Έμ œμ— λŒ€ν•œ 반볡적인 해결책이 ν•„μš”ν•œ κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.
  • 효율적인 μ½”λ“œ μœ μ§€λ³΄μˆ˜κ°€ ν•„μš”ν•œ 경우: μ½”λ“œμ˜ 일관성을 μœ μ§€ν•˜κ³  μœ μ§€λ³΄μˆ˜μ„±μ„ 높이기 μœ„ν•΄ λ””μžμΈ νŒ¨ν„΄μ„ λ„μž…ν•©λ‹ˆλ‹€.

5. λ””μžμΈ νŒ¨ν„΄μ˜ μž₯단점

5.1. μž₯점

  • μ½”λ“œμ˜ 일관성 μœ μ§€: ν‘œμ€€ν™”λœ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ 일관성이 μœ μ§€λ˜μ–΄ 가독성이 ν–₯μƒλ©λ‹ˆλ‹€.
  • μœ μ§€λ³΄μˆ˜μ„± ν–₯상: λ””μžμΈ νŒ¨ν„΄μ€ μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
  • μž¬μ‚¬μš©μ„± 증가: κ²€μ¦λœ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.

5.2. 단점

  • ν•™μŠ΅ 곑선: λͺ¨λ“  κ°œλ°œμžκ°€ λ””μžμΈ νŒ¨ν„΄μ„ μ΄ν•΄ν•˜κ³  μ μš©ν•˜λŠ” λ°μ—λŠ” ν•™μŠ΅ 곑선이 λ”°λ¦…λ‹ˆλ‹€.
  • μ˜€λ²„μ—”μ§€λ‹ˆμ–΄λ§μ˜ μœ„ν—˜: λͺ¨λ“  λ¬Έμ œμ— λŒ€ν•΄ λ””μžμΈ νŒ¨ν„΄μ„ μ μš©ν•˜λŠ” 것은 ν•„μš” μ΄μƒμœΌλ‘œ λ³΅μž‘ν•œ μ½”λ“œλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

6. λŒ€ν‘œμ μΈ λ””μžμΈ νŒ¨ν„΄ 예제 μ½”λ“œ

6.1. 싱글톀 νŒ¨ν„΄ (Singleton Pattern)

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // private constructor to prevent instantiation
    }

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

6.2. νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄ (Factory Method Pattern)

from abc import ABC, abstractmethod

class Product(ABC):
    @abstractmethod
    def create_product(self):
        pass

class ConcreteProduct(Product):
    def create_product(self):
        return "Concrete Product"

class Creator(ABC):
    @abstractmethod
    def factory_method(self):
        pass

    def get_product(self):
        return self.factory_method()

class ConcreteCreator(Creator):
    def factory_method(self):
        return ConcreteProduct()

# Usage
creator = ConcreteCreator()
product = creator.get_product()
print(product.create_product())

6.3. μ˜΅μ €λ²„ νŒ¨ν„΄ (Observer Pattern)

class Subject {
    constructor() {
        this.observers = [];
    }

    addObserver(observer) {
        this.observers.push(observer);
    }

    removeObserver(observer) {
        this.observers = this.observers.filter(obs => obs !== observer);
    }

    notifyObservers(data) {
        this.observers.forEach(observer => observer.update(data));
    }
}

class Observer {
    update(data) {
        console.log(`Received update with data: ${data}`);
    }
}

// Usage
const subject = new Subject();
const observerA = new Observer();
const observerB = new Observer();

subject.addObserver(observerA);
subject.addObserver(observerB);

subject.notifyObservers("Hello, observers!");

6.4. λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄ (Decorator Pattern)

from abc import ABC, abstractmethod

class Coffee(ABC):
    @abstractmethod


    def cost(self):
        pass

class SimpleCoffee(Coffee):
    def cost(self):
        return 5

class MilkDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

    def cost(self):
        return self._coffee.cost() + 2

# Usage
coffee = SimpleCoffee()
print(coffee.cost())  # Output: 5

milk_coffee = MilkDecorator(coffee)
print(milk_coffee.cost())  # Output: 7

6.5. μ „λž΅ νŒ¨ν„΄ (Strategy Pattern)

interface PaymentStrategy {
    void pay(int amount);
}

class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;

    public CreditCardPayment(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid with credit card");
    }
}

class PayPalPayment implements PaymentStrategy {
    private String email;

    public PayPalPayment(String email) {
        this.email = email;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid with PayPal");
    }
}

class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) {
        paymentStrategy.pay(amount);
    }
}

// Usage
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432"));
cart.checkout(100);

7. μ—°κ΄€λœ 기술: μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜

λ””μžμΈ νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜μ™€ λ°€μ ‘ν•œ 관련이 μžˆμŠ΅λ‹ˆλ‹€. μ•„ν‚€ν…μ²˜λŠ” 큰 규λͺ¨μ˜ μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜κ³  κ΅¬μΆ•ν•˜λŠ” 데에 도움이 λ˜λŠ” 원칙과 νŒ¨ν„΄μ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŠ” μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ μœ μ—°ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ μ‹œμŠ€ν…œμ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μˆ˜μ μΈ λΆ€λΆ„μž…λ‹ˆλ‹€.

λ””μžμΈ νŒ¨ν„΄κ³Ό μ•„ν‚€ν…μ²˜λŠ” ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ μ†Œν”„νŠΈμ›¨μ–΄μ˜ ν’ˆμ§ˆκ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, MVC(Model-View-Controller) μ•„ν‚€ν…μ²˜ νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λͺ¨λΈ, λ·°, 컨트둀러둜 κ΅¬λΆ„ν•˜μ—¬ κ°œλ°œμžλ“€μ΄ μ½”λ“œλ₯Ό 더 μ‰½κ²Œ ꡬ성할 수 있게 λ•μŠ΅λ‹ˆλ‹€.

8. κ²°λ‘ 

λ””μžμΈ νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ λ°œμƒν•˜λŠ” λ‹€μ–‘ν•œ λ¬Έμ œμ— λŒ€ν•œ 효과적인 해결책을 μ œκ³΅ν•©λ‹ˆλ‹€. μœ μ—°ν•˜κ³  μœ μ§€λ³΄μˆ˜μ„±μ΄ 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•΄ λ””μžμΈ νŒ¨ν„΄μ„ ν™œμš©ν•˜λŠ” 것은 κ°œλ°œμžλ“€μ—κ²Œ 큰 도움이 λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ¨λ“  상황에 λͺ¨λ“  νŒ¨ν„΄μ΄ μ ν•©ν•œ 것은 μ•„λ‹ˆλ©°, 상황에 맞게 μ μ ˆν•œ νŒ¨ν„΄μ„ μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

λŒ“κΈ€