Search
🙊

전략패턴

Intro::

전략패턴에 대한 정리본 입니다.

전략 패턴(Strategy Pattern)의 개념

하나의 기능(행동, 알고리즘을 여러 방식으로 구현해야 할 때, 각 방식(전략)을 별도의 클래스로 분리하고 이를 인터페이스를 통해 일관되게 사용하도록 구성합니다.
클라이언트는 전략 객체를 직접 사용하지 않고, 인터페이스를 통해 추상화된 전략을 사용함으로써 코드 변경 없이 전략을 쉽게 교체할 수 있습니다.

1. 할인 전략(Discount Strategy) 인터페이스 정의

먼저, 할인 전략을 공통으로 사용하는 인터페이스를 정의합니다. 모든 할인 정책은 calculateDiscountedPrice 메서드를 통해 정가에서 할인된 가격을 계산합니다.
ublic interface DiscountStrategy { /** * 정가에서 할인율을 적용하여 할인된 가격을 계산하는 메서드. * @param price 정가 * @return 할인 적용 후 가격 */ double calculateDiscountedPrice(double price); }
Java
복사

2. 구체적인 할인 전략 클래스 구현

각 클래스는 DiscountStrategy 인터페이스를 구현하여 자신의 할인 로직을 정의합니다.

2.1. 할인 없음(NoDiscountStrategy)

할인 정책이 없는 경우를 위한 전략입니다.
public class NoDiscountStrategy implements DiscountStrategy { @Override public double calculateDiscountedPrice(double price) { // 할인 없음: 정가 그대로 반환 return price; } }
Java
복사

2.2. 일반 할인(RegularDiscountStrategy)

예를 들어, 일반 고객에게 10% 할인을 적용하는 전략입니다.
public class RegularDiscountStrategy implements DiscountStrategy { private final double discountRate = 0.10; // 10% 할인 @Override public double calculateDiscountedPrice(double price) { return price * (1 - discountRate); } }
Java
복사

2.3. 프리미엄 할인(PremiumDiscountStrategy)

프리미엄 고객에게 20% 할인을 적용하는 전략입니다.
public class PremiumDiscountStrategy implements DiscountStrategy { private final double discountRate = 0.20; // 20% 할인 @Override public double calculateDiscountedPrice(double price) { return price * (1 - discountRate); } }
Java
복사

3. Context 클래스: PriceCalculator

컨텍스트 클래스는 DiscountStrategy 인터페이스에 의존하여, 어떤 할인 전략을 사용할지 런타임에 결정할 수 있습니다.
public class PriceCalculator { private DiscountStrategy discountStrategy; // 할인 전략을 설정하는 메서드 public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } // 설정된 할인 전략을 이용하여 할인된 가격 계산 public double getFinalPrice(double price) { if (discountStrategy == null) { throw new IllegalStateException("할인 전략이 설정되지 않았습니다."); } return discountStrategy.calculateDiscountedPrice(price); } }
Java
복사

4. 사용 예: Main 클래스에서 전략 교체

메인 클래스에서는 고객의 등급에 따라 PriceCalculator의 할인 전략을 변경하여 할인된 가격을 계산하는 과정을 보여줍니다.
public class Main { public static void main(String[] args) { PriceCalculator calculator = new PriceCalculator(); double originalPrice = 100000; // 예: 정가 100,000원 // 할인 전략이 없는 경우 calculator.setDiscountStrategy(new NoDiscountStrategy()); System.out.println("No Discount: " + calculator.getFinalPrice(originalPrice)); // 일반 고객 할인 적용 calculator.setDiscountStrategy(new RegularDiscountStrategy()); System.out.println("Regular Discount (10%): " + calculator.getFinalPrice(originalPrice)); // 프리미엄 고객 할인 적용 calculator.setDiscountStrategy(new PremiumDiscountStrategy()); System.out.println("Premium Discount (20%): " + calculator.getFinalPrice(originalPrice)); } }
Java
복사
실행 결과는 아래와 같이 출력됩니다.
No Discount: 100000.0 Regular Discount (10%): 90000.0 Premium Discount (20%): 80000.0
Plain Text
복사

5. 상세 설명

인터페이스와 구체 전략:
DiscountStrategy 인터페이스를 통해 할인 계산 메서드를 정의하고, 각 구체 전략 클래스(NoDiscountStrategy, RegularDiscountStrategy, PremiumDiscountStrategy)는 서로 다른 할인 로직을 캡슐화합니다.
이를 통해 새로운 할인 정책이 추가되더라도 기존 코드를 수정하지 않고 새로운 클래스를 작성하여 확장할 수 있습니다.
컨텍스트 클래스(PriceCalculator):
PriceCalculator는 DiscountStrategy 인터페이스에 의존하여 할인 로직을 실행합니다.
클라이언트는 필요한 할인 전략을 런타임에 설정할 수 있으며, 이로 인해 코드가 유연해지고 유지보수가 쉬워집니다.
전략 패턴의 장점:
유연성: 할인 정책을 객체로 분리하여, 상황에 맞게 전략을 변경할 수 있음.
확장성: 새로운 할인 정책이 추가되더라도 기존 코드를 변경하지 않아도 됨.
테스트 용이성: 각 할인 전략을 별도로 단위 테스트할 수 있어, 개별 알고리즘의 검증이 용이함.

6. 결론

전략 패턴은 여러 알고리즘(또는 정책)을 클래스별로 분리하여, 런타임에 필요에 따라 선택하거나 교체할 수 있게 해줍니다.
위 예제에서는 할인 정책을 통해 전략 패턴을 구체적으로 구현하였으며, 이를 통해 코드의 유연성과 유지보수성을 높이는 방법을 확인할 수 있습니다.

References::