cs

전략 패턴 - Java

icodesiuuuu 2025. 7. 13. 14:19

전략 패턴이란?

 전략 패턴이란 알고리즘을 각각 분리해서 클래스로 만들고, 그 알고리즘을 사용하는 쪽에서 필요할 때 선택해서 사용하는 방식이다. 쉽게 말해, 자주 바뀌는 기능을 하나의 클래스로 묶지 않고 외부로 분리해서 관리하는 설계 방식이다.

 

전략 패턴의 구조:

1️⃣ Strategy (인터페이스 또는 추상 클래스)

  • 알고리즘의 공통 메서드 선언

2️⃣ ConcreteStrategy (구체 전략)

  • Strategy를 구현한 실제 알고리즘 클래스들

3️⃣ Context (문맥, 전략을 사용하는 쪽)

  • Strategy 객체를 받아서, 필요한 곳에서 전략 메서드를 호출

 

예시 코드

// 1. Strategy 인터페이스
public interface PaymentStrategy {
    void pay(int amount);
}

// 2. ConcreteStrategy
public class CreditCardPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("신용카드로 " + amount + "원 결제했습니다.");
    }
}

public class KakaoPayPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("카카오페이로 " + amount + "원 결제했습니다.");
    }
}

// 3. Context
public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public ShoppingCart(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

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

// 사용 예
public class Main {
    public static void main(String[] args) {
        ShoppingCart cart1 = new ShoppingCart(new CreditCardPayment());
        cart1.checkout(10000);

        ShoppingCart cart2 = new ShoppingCart(new KakaoPayPayment());
        cart2.checkout(5000);
    }
}

 

 

전략 패턴 없이 코드를 작성했다면?

public class ShoppingCart {
    public void checkout(String paymentType, int amount) {
        if (paymentType.equals("creditCard")) {
            System.out.println("신용카드로 " + amount + "원 결제했습니다.");
        } else if (paymentType.equals("kakaoPay")) {
            System.out.println("카카오페이로 " + amount + "원 결제했습니다.");
        } else if (paymentType.equals("naverPay")) {
            System.out.println("네이버페이로 " + amount + "원 결제했습니다.");
        }
    }
}

 

  • 결제 방식이 늘어날 때마다 checkout 메서드 수정 필요 (OCP 위반)
  • 조건문이 길어짐 → 가독성 및 유지보수 어려움
  • 테스트 및 재사용성 떨어짐

 

전략 패턴의 장점

  • 새로운 기능 추가 시 기존 코드를 수정하지 않고 새로운 클래스를 추가하기만 하면 된다.
  • OCP 원칙을 지킬 수 있다.
  • 결제 방식(또는 알고리즘)을 독립적으로 관리하고 테스트할 수 있다.
  • 중복 코드가 줄어들고, 코드 가독성이 향상된다.
🤔어느 상황에서 주로 사용할까?

- 여러 알고리즘을 유연하게 교체해야 하는 상황
- if-else 또는 switch문이 반복해서 등장하는 경우
- 결제 방식, 정렬 알고리즘, 필터링 조건 등 다양한 옵션을 제공해야 하는 서비스에서 자주 사용한다.
- 게임에서 캐릭터 공격 방법, 이동 방식 등을 동적으로 바꾸고 싶을 때도 사용한다.

 

전략 패턴의 단점

  • 클래스가 많아진다. 알고리즘 하나당 클래스 하나씩 생기기 때문에 구조가 복잡해질 수 있다.
  • 간단한 상황에서는 오히려 과한 설계가 될 수 있다.
  • 사용하는 쪽에서 어떤 전략이 필요한지 알고 주입해줘야 하기 때문에 약간의 번거로움이 있다.

'cs' 카테고리의 다른 글

싱글톤 패턴 - Java  (2) 2025.07.11
[Java] JVM, JRE, JDK  (0) 2025.04.24
프록시(Proxy)  (0) 2024.12.26
[Spring boot] compile과 implementation  (1) 2024.12.04