같은 문제를 해결하는 여러 알고리즘을 각각 캡슐화해서 런타임에 교체 가능하게 만드는 전략 패턴을, 간단한 자바 예시로 정리했습니다.
전략 패턴이란
같은 문제를 해결하는 여러 알고리즘을 각각 캡슐화하여, 런타임(실행 시점)에 교체 가능하도록 만드는 행동 디자인 패턴입니다. "어떻게 할지(How)"를 사용하는 쪽(Context)에서 분리해서, 알고리즘(Strategy)만 갈아끼울 수 있게 만드는 게 핵심입니다.
예시: 결제 수단
결제 수단이 카드/카카오페이/포인트로 여러 개 있고, 상황에 따라 골라 써야 하는 경우를 생각해보겠습니다
나쁜 예 (if-else로 분기)
java
public void pay(String type, int amount) {
if (type.equals("CARD")) {
// 카드 결제 로직
} else if (type.equals("KAKAO")) {
// 카카오페이 결제 로직
} else if (type.equals("POINT")) {
// 포인트 결제 로직
}
}
결제 수단이 늘어날 때마다 이 메서드를 계속 고쳐야 하고, 각 로직이 한 메서드 안에 뒤섞여 있습니다.
전략 패턴 적용
java
// 전략 인터페이스: "결제한다"는 행위만 정의
public interface PaymentStrategy {
void pay(int amount);
}
// 구체적인 전략들
public class CardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println(amount + "원을 카드로 결제");
}
}
public class KakaoPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println(amount + "원을 카카오페이로 결제");
}
}
// Context: 전략을 사용하는 쪽. 어떤 전략인지는 몰라도 됨
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void setStrategy(PaymentStrategy strategy) { // 런타임에 교체 가능
this.strategy = strategy;
}
public void pay(int amount) {
strategy.pay(amount); // 실제 결제는 전략 객체에 위임
}
}
java
PaymentContext context = new PaymentContext(new CardPayment());
context.pay(10000); // 카드로 결제
context.setStrategy(new KakaoPayment()); // 실행 중에 전략 교체
context.pay(5000); // 카카오페이로 결제
무엇이 좋아졌나
- PaymentContext는 결제 방식이 몇 종류인지, 어떻게 구현됐는지 전혀 몰라도 됩니다. 그냥 PaymentStrategy 인터페이스만 알고 위임할 뿐입니다.
- 새 결제 수단이 추가돼도 PaymentContext 코드는 건드릴 필요 없이, PaymentStrategy를 구현한 클래스만 하나 추가하면 됩니다(개방-폐쇄 원칙, OCP).
- if-else 분기가 사라지고, 각 알고리즘이 각자의 클래스로 분리되어 테스트하기도 쉬워집니다.
'DEV > cs' 카테고리의 다른 글
| [CS] TCP vs UDP 비교 (0) | 2026.09.18 |
|---|---|
| [CS] 데드락(Deadlock)이란 - 발생 조건과 해결 방법 (0) | 2026.09.17 |
| [CS] JAVA 가비지 컬렉션(GC)이란 (0) | 2026.09.16 |
| [CS] JAVA 인터페이스 vs 추상클래스, 뭐가 다른가 (0) | 2026.09.15 |
| [CS] 객체지향과 절차지향 프로그래밍이란, 비교 (0) | 2026.09.14 |