nest.js
node.js(상속, 전략패턴)(2024.05.20)
goblin-
2024. 5. 20. 17:47
상속(Inheritance)과 전략 패턴(Strategy Pattern)은 둘 다 객체 지향 프로그래밍에서 코드 재사용과 확장성을 제공하는 방법이지만, 그 사용 목적과 적용 방법이 다릅니다.
1. 상속(Inheritance)
- 기본 개념: 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 것.
- 사용 목적: 코드 재사용 및 계층 구조를 통해 기능 확장.
- 특징:
- 강한 결합: 부모 클래스와 자식 클래스 사이에 강한 결합이 발생합니다.
- 기능 확장: 부모 클래스의 기능을 확장하거나, 오버라이딩을 통해 기능을 변경합니다.
- "몸통을 가지고 특정 기능 추가": 자식 클래스가 부모 클래스의 속성과 메서드를 상속받아, 이를 확장하거나 새로운 기능을 추가합니다.
2. 전략 패턴(Strategy Pattern)
- 기본 개념: 행위(전략)를 클래스로 캡슐화하고, 동적으로 전략을 변경할 수 있도록 하는 디자인 패턴.
- 사용 목적: 실행 중에 알고리즘을 선택하거나 변경할 수 있게 함.
- 특징:
- 느슨한 결합: 행위(전략)와 이를 사용하는 컨텍스트 사이에 느슨한 결합을 유지합니다.
- 유연성: 런타임에 전략을 변경할 수 있는 유연성을 제공합니다.
- "몸통 가지고 그 안의 내부를 바꾸는 것": 전략 패턴에서는 컨텍스트 객체가 내부적으로 사용하는 알고리즘(전략)을 동적으로 변경할 수 있습니다.
상속 예제
// 부모 클래스
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
// 자식 클래스
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // Rex barks.
전략패턴 예제
// 전략 인터페이스
class PaymentStrategy {
pay(amount) {
throw new Error('This method should be overridden!');
}
}
// 구체적인 전략
class CreditCardStrategy extends PaymentStrategy {
pay(amount) {
console.log(`Paid ${amount} using Credit Card`);
}
}
class PayPalStrategy extends PaymentStrategy {
pay(amount) {
console.log(`Paid ${amount} using PayPal`);
}
}
// 컨텍스트 클래스
class PaymentContext {
constructor(strategy) {
this.strategy = strategy;
}
setStrategy(strategy) {
this.strategy = strategy;
}
executePayment(amount) {
this.strategy.pay(amount);
}
}
// 사용 예시
const creditCardPayment = new CreditCardStrategy();
const payPalPayment = new PayPalStrategy();
const paymentContext = new PaymentContext(creditCardPayment);
paymentContext.executePayment(100); // Paid 100 using Credit Card
paymentContext.setStrategy(payPalPayment);
paymentContext.executePayment(200); // Paid 200 using PayPal
- 여기서 PaymentContext는 전략 패턴을 사용하여 PaymentStrategy를 동적으로 변경할 수 있습니다. PaymentContext는 setStrategy 메서드를 통해 전략을 변경할 수 있으며, executePayment 메서드를 호출하면 현재 설정된 전략에 따라 결제가 처리됩니다.
결론
- 상속은 클래스 계층 구조를 통해 코드를 재사용하고 기능을 확장하는 데 사용됩니다. 이는 강한 결합을 가지며, 부모 클래스의 기능을 자식 클래스에서 확장하거나 변경합니다.
- 전략 패턴은 알고리즘을 캡슐화하여 런타임에 동적으로 변경할 수 있도록 합니다. 이는 느슨한 결합을 유지하며, 유연성을 제공합니다.