반응형
전략 패턴의 정의
전략 패턴은 객체가 할 수 있는 행위(알고리즘)를 각각의 클래스로 캡슐화하고, 이들을 필요에 따라 동적으로 바꾸어 사용할 수 있게 만드는 디자인 패턴입니다.
즉, 알고리즘의 선택과 사용을 클라이언트와 독립적으로 만들어 유연성을 높이는 패턴입니다.
전략 패턴의 목적
- 알고리즘을 사용하는 코드로부터 알고리즘 자체를 분리하여 결합도를 낮출 수 있습니다.
- 런타임에 전략을 변경할 수 있도록 하여 유연성을 극대화합니다.
- 다양한 조건에 따라 서로 다른 알고리즘을 적용해야 할 때 중복 코드나 조건문을 방지할 수 있습니다.
- 새로운 알고리즘 추가가 쉽고, 유지보수가 용이합니다.
전략 패턴의 구성 요소
- Strategy: 알고리즘의 공통 인터페이스를 정의합니다.
- ConcreteStrategy: 실제 알고리즘을 구현하는 클래스입니다. Strategy 인터페이스를 구현합니다.
- Context: 전략을 사용하는 클래스입니다. Strategy 객체를 참조하며, 이를 통해 알고리즘을 실행합니다.
전략 패턴의 예시 코드 (Java)
전략 인터페이스 (Strategy)
public interface PaymentStrategy {
void pay(int amount);
}
구체적인 전략 클래스들 (ConcreteStrategy)
public class CreditCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
public CreditCardStrategy(String name, String cardNumber) {
this.name = name;
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println("Paid by Credit Card: " + amount);
}
}
public class KakaoPayStrategy implements PaymentStrategy {
private String email;
public KakaoPayStrategy(String email) {
this.email = email;
}
@Override
public void pay(int amount) {
System.out.println("Paid by KakaoPay: " + amount);
}
}
전략을 사용하는 클래스 (Context)
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(int amount) {
strategy.pay(amount);
}
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
}
사용 예시 (Client)
public class Client {
public static void main(String[] args) {
PaymentContext context = new PaymentContext(new CreditCardStrategy("John", "1234-5678"));
context.executePayment(10000);
context.setStrategy(new KakaoPayStrategy("john@example.com"));
context.executePayment(5000);
}
}
전략 패턴의 장점
- 조건문이나 중복 코드 없이 알고리즘의 교체가 가능하다.
- 런타임에서 알고리즘을 쉽게 바꿀 수 있다.
- 알고리즘이 캡슐화되어 독립적인 유지보수가 가능하다.
- 개방-폐쇄 원칙(OCP)을 준수하며, 시스템의 확장성이 높아진다.
전략 패턴의 단점
- 알고리즘이 간단하고 잘 변하지 않는 경우에는 과도하게 복잡해질 수 있다.
- 많은 전략 클래스가 만들어질 수 있어 클래스의 개수가 증가할 수 있다.
전략 패턴의 활용 예시
- 결제 방식 선택 시스템
- 정렬 알고리즘 선택 (버블 정렬, 퀵 정렬, 병합 정렬)
- 게임 내 캐릭터의 다양한 공격 방식 관리
전략 패턴 vs 의존성 주입 개요 비교
항목 | 전략 패턴 (Strategy Pattern) | 의존성 주입(Dependency Injection) |
목적 | 행위(로직)를 캡슐화하여 유연하게 교체 가능하게 함 | 의존 객체를 외부에서 주입하여 결합도 낮춤 |
대상 | 행위(Behavior) 변경 | 객체 간 의존 관계 설정 |
컨텍스트 존재 여부 | 예 (Context가 전략을 실행) | 명시적인 컨텍스트는 없을 수도 있음 |
결합도 | 낮음 (인터페이스로 전략 교체 가능) | 낮음 (외부 주입으로 내부 구현 분리) |
적용 시점 | 런타임에 전략 교체 가능 | 생성자, 세터, 필드 등 주입 시점에 결정됨 |
대표 예시 | 정렬 방식 전략, 할인 정책 전략 등 | 스프링의 @Autowired, 생성자 주입 등 |
DI(의존성 주입)와 DIP(의존 역전 원칙)
1. DI 개념 정의의존성 주입(Dependency Injection, DI) 이란 객체가 다른 객체의 의존성(Dependency)을 외부에서 주입받아 사용하는 소프트웨어 설계 기법이다.즉, 객체가 스스로 의존하는 객체를 생성하지
mint10.tistory.com
반응형
'CS 공부일지 > 디자인패턴 공부일지' 카테고리의 다른 글
프록시 패턴(Proxy Pattern)의 개념과 특징 (0) | 2025.04.01 |
---|---|
옵저버 패턴(Observer Pattern)의 개념과 특징 (0) | 2025.03.31 |
이터레이터 패턴(Iterator Pattern)의 개념과 특징 (0) | 2025.03.31 |
팩토리 패턴(Factory Pattern)의 개념과 특징 (0) | 2025.03.31 |
싱글톤 패턴(Singleton Pattern)의 정의와 구현 방법 (0) | 2025.03.31 |