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