전략(Strategy) 패턴
2024. 10. 14. 05:07ㆍDesign Pattern
전략 패턴(Strategy Pattern)
전략 패턴(Strategy Pattern)은 여러 알고리즘을 하나의 추상화된 인터페이스로 정의하고, 해당 인터페이스를 통해 다양한 알고리즘을 쉽게 교체할 수 있도록 하는 디자인 패턴입니다. 이 패턴은 런타임에 알고리즘을 동적으로 변경할 수 있어 코드의 유연성과 확장성을 크게 높입니다.
1. 전략 패턴이란?
전략 패턴은 동작(알고리즘)을 캡슐화하여 교체할 수 있도록 하는 패턴입니다. 여러 개의 알고리즘이 존재할 때, 이들을 각각 클래스로 분리하여 서로 교체 가능한 구조를 만들어 줍니다. 클라이언트는 구체적인 알고리즘을 알 필요 없이, 일관된 방식으로 동작을 처리할 수 있습니다.
2. 전략 패턴 구조
전략 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:
- Strategy(전략 인터페이스): 구체적인 알고리즘들이 구현할 인터페이스를 정의합니다.
- ConcreteStrategy(구체적인 전략 클래스): 인터페이스에 정의된 메서드를 실제로 구현한 클래스입니다.
- Context(문맥 클래스): Strategy 인터페이스를 사용하여 클라이언트가 알고리즘을 호출하고 관리하는 역할을 담당합니다.
3. 전략 패턴 예제
3.1 전략 인터페이스 정의
// 전략 인터페이스
public interface IStrategy
{
void Execute();
}
3.2 구체적인 전략 클래스 정의
// ConcreteStrategyA - 전략 A
public class StrategyA : IStrategy
{
public void Execute()
{
Console.WriteLine("전략 A를 실행합니다.");
}
}
// ConcreteStrategyB - 전략 B
public class StrategyB : IStrategy
{
public void Execute()
{
Console.WriteLine("전략 B를 실행합니다.");
}
}
3.3 Context 클래스 정의
// Context 클래스
public class Context
{
private IStrategy _strategy;
// 생성자를 통해 전략을 설정
public Context(IStrategy strategy)
{
_strategy = strategy;
}
// 전략을 실행하는 메서드
public void ExecuteStrategy()
{
_strategy.Execute();
}
// 런타임에 전략을 변경할 수 있는 메서드
public void SetStrategy(IStrategy strategy)
{
_strategy = strategy;
}
}
3.4 전략 패턴 사용
class Program
{
static void Main(string[] args)
{
// 초기 전략 설정
Context context = new Context(new StrategyA());
context.ExecuteStrategy(); // "전략 A를 실행합니다."
// 런타임에 전략 변경
context.SetStrategy(new StrategyB());
context.ExecuteStrategy(); // "전략 B를 실행합니다."
}
}
출력 결과:
전략 A를 실행합니다.
전략 B를 실행합니다.
4. 전략 패턴의 장점
- 알고리즘의 교체 가능성: 전략 패턴을 사용하면 런타임에 알고리즘을 쉽게 교체할 수 있습니다. 이를 통해 프로그램이 동작 중에 필요한 알고리즘을 유연하게 변경할 수 있습니다.
- 유지보수성 증가: 알고리즘별로 클래스를 분리하여 관리하므로, 각 알고리즘에 대한 유지보수가 용이합니다. 새로운 알고리즘을 추가할 때도 기존 코드를 수정하지 않고, 새로운 전략 클래스만 추가하면 됩니다.
- 코드 중복 제거: 알고리즘의 공통 부분은 Context 클래스에서 처리하고, 전략 클래스에서 각 알고리즘의 차이점을 구현하므로, 코드 중복을 줄일 수 있습니다.
5. 전략 패턴의 단점
- 클래스 증가: 각 알고리즘마다 별도의 클래스를 정의해야 하기 때문에 클래스가 많아질 수 있습니다. 이는 코드 관리에 부담을 줄 수 있습니다.
- 복잡도 증가: 간단한 알고리즘 교체를 위해 너무 많은 클래스를 도입하는 경우, 오히려 코드가 복잡해질 수 있습니다. 작은 프로젝트에는 적합하지 않을 수 있습니다.
6. 전략 패턴의 활용 사례
- 정렬 알고리즘: 여러 정렬 방법(예: 버블 정렬, 퀵 정렬)을 상황에 맞게 선택하여 사용해야 할 때, 전략 패턴을 적용하여 런타임에 알고리즘을 교체할 수 있습니다.
- 게임 AI: 게임 캐릭터의 AI 동작(예: 공격 전략, 방어 전략 등)을 상황에 따라 변경할 때, 각 전략을 독립적인 클래스로 관리할 수 있습니다.
- 유저 인증: 애플리케이션에서 유저 인증 방식을 (예: OAuth, Basic Auth 등) 상황에 맞게 변경할 때, 전략 패턴을 통해 다양한 인증 방식이 쉽게 교체될 수 있습니다.
7. 전략 패턴과 유사한 패턴
- 상태 패턴(State Pattern): 상태 패턴은 객체의 상태에 따라 동작이 변경되는 경우에 사용되며, 전략 패턴은 알고리즘 자체가 교체될 때 사용됩니다.
- 템플릿 메서드 패턴(Template Method Pattern): 전략 패턴과 달리 알고리즘의 구조가 고정된 상황에서 하위 클래스가 세부 단계를 오버라이드하여 동작을 변경할 수 있습니다.
전략 패턴은 다양한 알고리즘을 클라이언트 코드에 영향을 주지 않고 교체할 수 있는 강력한 패턴입니다.
이를 통해 코드의 유연성을 높이고 유지보수를 용이하게 할 수 있습니다. 단, 너무 많은 클래스가 도입되는 경우 복잡도가 증가할 수 있으므로, 적절한 시점에 적용하는 것이 중요합니다.
'Design Pattern' 카테고리의 다른 글
MVVM (Model-View-ViewModel) 패턴 (2) | 2024.10.14 |
---|---|
MVC (Model-View-Controller) 패턴 (1) | 2024.10.14 |
상태(State) 패턴 (0) | 2024.10.14 |
퍼사드(Facade) 패턴 (0) | 2024.10.14 |
데코레이터(Decorator) 패턴 (1) | 2024.10.14 |