λμμΈ ν¨ν΄: μννΈμ¨μ΄ κ°λ°μ μ€μ©μ μΈ ν΄λ²
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. κ²°λ‘
λμμΈ ν¨ν΄μ μννΈμ¨μ΄ κ°λ°μμ λ°μνλ λ€μν λ¬Έμ μ λν ν¨κ³Όμ μΈ ν΄κ²°μ± μ μ 곡ν©λλ€. μ μ°νκ³ μ μ§λ³΄μμ±μ΄ λμ μ½λλ₯Ό μμ±νκΈ° μν΄ λμμΈ ν¨ν΄μ νμ©νλ κ²μ κ°λ°μλ€μκ² ν° λμμ΄ λ©λλ€. κ·Έλ¬λ λͺ¨λ μν©μ λͺ¨λ ν¨ν΄μ΄ μ ν©ν κ²μ μλλ©°, μν©μ λ§κ² μ μ ν ν¨ν΄μ μ ννλ κ²μ΄ μ€μν©λλ€.
'IT' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ»΄ν¨ν° κ³Όν(CS)μ ν΅μ¬ μ΄ν΄: κΈ°μ΄λΆν° μ¬νκΉμ§ (0) | 2024.02.27 |
---|---|
LMS(Learning Management System): νμ΅μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νλ μμ€ν (0) | 2024.02.27 |
μ μ°¨μ§ν₯κ³Ό κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°: μ΄ν΄μ νμ© (0) | 2024.02.26 |
μ»΄νμΌλ¬: μ½λ λ²μμ λκ° (0) | 2024.02.26 |
μΈν°ν리ν°: μ½λλ₯Ό μ€ννλ λμ μΈμ΄ μ²λ¦¬κΈ° (0) | 2024.02.26 |
λκΈ