전략(Strategy) 패턴

2024. 10. 14. 05:07Design Pattern

전략 패턴(Strategy Pattern)

전략 패턴(Strategy Pattern)은 여러 알고리즘을 하나의 추상화된 인터페이스로 정의하고, 해당 인터페이스를 통해 다양한 알고리즘을 쉽게 교체할 수 있도록 하는 디자인 패턴입니다. 이 패턴은 런타임에 알고리즘을 동적으로 변경할 수 있어 코드의 유연성과 확장성을 크게 높입니다.


1. 전략 패턴이란?

전략 패턴은 동작(알고리즘)을 캡슐화하여 교체할 수 있도록 하는 패턴입니다. 여러 개의 알고리즘이 존재할 때, 이들을 각각 클래스로 분리하여 서로 교체 가능한 구조를 만들어 줍니다. 클라이언트는 구체적인 알고리즘을 알 필요 없이, 일관된 방식으로 동작을 처리할 수 있습니다.


2. 전략 패턴 구조

전략 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:

  1. Strategy(전략 인터페이스): 구체적인 알고리즘들이 구현할 인터페이스를 정의합니다.
  2. ConcreteStrategy(구체적인 전략 클래스): 인터페이스에 정의된 메서드를 실제로 구현한 클래스입니다.
  3. 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. 전략 패턴의 장점

  1. 알고리즘의 교체 가능성: 전략 패턴을 사용하면 런타임에 알고리즘을 쉽게 교체할 수 있습니다. 이를 통해 프로그램이 동작 중에 필요한 알고리즘을 유연하게 변경할 수 있습니다.
  2. 유지보수성 증가: 알고리즘별로 클래스를 분리하여 관리하므로, 각 알고리즘에 대한 유지보수가 용이합니다. 새로운 알고리즘을 추가할 때도 기존 코드를 수정하지 않고, 새로운 전략 클래스만 추가하면 됩니다.
  3. 코드 중복 제거: 알고리즘의 공통 부분은 Context 클래스에서 처리하고, 전략 클래스에서 각 알고리즘의 차이점을 구현하므로, 코드 중복을 줄일 수 있습니다.

5. 전략 패턴의 단점

  1. 클래스 증가: 각 알고리즘마다 별도의 클래스를 정의해야 하기 때문에 클래스가 많아질 수 있습니다. 이는 코드 관리에 부담을 줄 수 있습니다.
  2. 복잡도 증가: 간단한 알고리즘 교체를 위해 너무 많은 클래스를 도입하는 경우, 오히려 코드가 복잡해질 수 있습니다. 작은 프로젝트에는 적합하지 않을 수 있습니다.

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