디자인패턴 - 전략패턴

JeongHoHyun·2025년 3월 9일

Java

목록 보기
19/23

전략패턴 (Strategy Pattern)

행동(알고리즘)을 캡술화하고 이를 동적으로 변경할 수 있도록 하는 디자인 패턴이다.
실행 중에 알고리즘을 선택하거나 교체할 수 있도록 한다.

전략패턴 핵심 개념

  1. 알고리즘 군을 정의하고 이를 개별 클래스로 캡슐화하여 독립적으로 변경할 수 있도록 한다.
  2. 상속이 아닌 위임(Composition) 방식을 사용하여 실행 중에 전략을 바꿀 수 있도록 한다.
  3. OCP(개방-폐쇠 원칙)을 만족하여 새로운 전략을 추각할 때 기존 코드에 영향을 주지 않는다.

전략패턴의 구조

  1. Strategy 인터페이스
    • 여러 전략(알고리즘)의 공통 인터페이스를 정의.
  2. Concrete Strategy(구체적인 전략 클래스들)
    • 인터페이스를 구현하여 실제 동작을 정의.
  3. Context(전략으 사용하는 컨택스트 클래스)
    • 클라이언트가 직접 알고리즘을 선택하지 않고 전략 객체를 주입받아 사용.

예제 코드(Java)

Strategy 인터페이스

// 전략 인터페이스
public interface PaymentStrategy {
    void pay(int amount);
}

구체적인 전략 구현체

// 신용카드 결제 전략
public class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;

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

    @Override
    public void pay(int amount) {
        System.out.println(amount + "원을 신용카드(" + cardNumber + ")로 결제했습니다.");
    }
}

// 페이팔 결제 전략
public class PayPalPayment implements PaymentStrategy {
    private String email;

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

    @Override
    public void pay(int amount) {
        System.out.println(amount + "원을 PayPal(" + email + ")로 결제했습니다.");
    }
}

Context(전략을 사용하는 클래스)

// 결제 처리 컨텍스트
public class PaymentContext {
    private PaymentStrategy paymentStrategy;

    // 전략을 동적으로 변경 가능
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void pay(int amount) {
        if (paymentStrategy == null) {
            System.out.println("결제 방법이 선택되지 않았습니다.");
            return;
        }
        paymentStrategy.pay(amount);
    }
}

사용 예제

public class StrategyPatternExample {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();

        // 신용카드로 결제
        context.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432"));
        context.pay(10000);

        // PayPal로 결제
        context.setPaymentStrategy(new PayPalPayment("user@example.com"));
        context.pay(20000);
    }
}

전략패턴의 장점과 단점

✅ 장점

  1. 유연한 알고리즘 교체 : 런타임에 알고리즘을 변경할 수 있음.
  2. OCP(개방-폐쇠 원칙) 준수 : 기존 코드 수정 없이 새로운 전략을 추가 가능.
  3. 코드 재사용성 증가 : 중복 코드 제거 및 유지보수 용이.

❌ 단점

  1. 전략 클래스가 많아짐 : 단순한 경우, 불필요하게 클래스가 많아짐.
  2. 클라이언트가 전략을 알아야 함 : 클라이언트가 적절한 전략을 선택해야 하기 때문.

어디서 사용될까?

  • 결제 시스템
    • 신용카드, PayPal, 계좌이체 등 여러가지 결제 방식을 동적으로 변경 가능.
  • 정렬 알고리즘 선택
    • Comparator를 사용하여 정렬 기준을 다르게 적용.
  • 데이터 압축 알고리즘
    • ZIP, GZIP, RAR 등 다양한 압축 알고리즘 적용.
  • AI 게임 개발
    • NPC 행동 전략 변경 (공격/방어/도망 전략 등)
profile
Java Back-End 2022.11.01 💻~ing

0개의 댓글