💡 Strategy 패턴이란?
전략(Strategy) 패턴은 객체 지향 프로그래밍에서 널리 사용되는 디자인 패턴 중 하나입니다. 이 패턴의 핵심은 특정 태스크를 수행하는 알고리즘(전략)을 객체의 행동으로 캡슐화하고, 이를 동적으로 변경할 수 있게 하는 것입니다. 즉, 알고리즘의 변경이 사용자나 클라이언트 코드에 영향을 미치지 않으면서도 알고리즘을 유연하게 교체할 수 있습니다. 이는 '전략'을 정의하는 일련의 클래스들을 생성하고, 이 클래스들이 동일한 인터페이스나 추상 클래스를 구현하도록 함으로써 달성됩니다.
🌟 전략 패턴의 장점
- 확장성: 새로운 전략을 추가하기 위해 기존 코드를 변경할 필요가 없습니다.
- 재사용성: 다른 문맥에서도 같은 전략을 재사용할 수 있습니다.
- 유지보수 용이: 전략을 독립적으로 개발하고 테스트할 수 있어 유지보수가 용이합니다.
- 원칙 준수: 개방-폐쇄 원칙(Open-Closed Principle)과 단일 책임 원칙(Single Responsibility Principle)을 준수합니다.
개방-폐쇄 원칙 (Open-Closed Principle)
개방-폐쇄 원칙은 소프트웨어 개체(클래스, 모듈, 함수 등)가 확장에는 열려 있어야 하지만, 수정에는 닫혀 있어야 한다는 원칙입니다.
전략 패턴에서의 적용: 전략 패턴은 새로운 전략(즉, 새로운 알고리즘 또는 행동)을 추가할 때 기존의 코드(특히Context
클래스)를 수정할 필요가 없습니다. 새로운 전략을 구현하기 위해Strategy
인터페이스를 구현하는 새로운 클래스를 추가하기만 하면 됩니다. 따라서 시스템은 새로운 기능 확장에는 열려 있지만, 기존 코드의 변경 없이도 이를 수용할 수 있으므로 개방-폐쇄 원칙을 준수합니다.
단일 책임 원칙 (Single Responsibility Principle)
단일 책임 원칙은 클래스가 하나의 기능만을 가지고, 그 책임은 오직 하나의 클래스에만 속해야 한다는 원칙입니다.
전략 패턴에서의 적용: 전략 패턴에서 각 전략 클래스(ConcreteStrategy
)는 하나의 알고리즘 또는 행동을 캡슐화합니다. 이는 각 전략 클래스가 하나의 책임만을 가지며, 그 책임은 전적으로 해당 클래스에 속한다는 것을 의미합니다. 또한,Context
클래스는 전략의 선택과 실행의 관리를 담당하지만, 실제 전략의 구현에 대해서는 알지 못합니다. 이렇게 책임이 분리되어 있기 때문에 단일 책임 원칙을 준수합니다.
📐 클래스 다이어그램
전략 패턴의 클래스 다이어그램은 다음과 같습니다.
이 다이어그램은 전략 패턴의 구조를 보여주며, 각 클래스와 인터페이스의 관계를 명확하게 설명합니다.
Context
: 전략(Strategy) 객체를 가지고 있는 클래스입니다. 전략을 설정하고 (setStrategy
) 해당 전략을 실행(executeStrategy
)하는 메서드를 포함합니다.Strategy
: 전략을 정의하는 인터페이스. 모든 구체적인 전략 클래스들(ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC)은 이 인터페이스를 구현합니다.ConcreteStrategyA
,ConcreteStrategyB
,ConcreteStrategyC
: 구체적인 전략을 구현하는 클래스들입니다. 각각 다른 방식으로algorithmInterface
메서드를 구현합니다.
🛠 사용 사례
전략 패턴은 다양한 상황에서 유용합니다. 예를 들어, 소프트웨어의 로그 기능에 대해 생각해보면, 로그를 콘솔, 파일, 또는 네트워크 등 다양한 방식으로 출력할 수 있습니다. 각각의 출력 방식은 별도의 '전략'으로 구현되며, 실행 중에 필요에 따라 교체될 수 있습니다.
- LoggerContext 클래스:
- 역할: 로그 메시지를 출력하는 주체입니다. 사용할 로그 전략을 결정하고, 로그 메시지를 전달합니다.
- 특징:
LogStrategy strategy
: 로그 전략을 저장하는 멤버 변수입니다.setLogStrategy(LogStrategy strategy)
: 사용할 로그 전략을 설정하는 메서드입니다.logMessage(String message)
: 로그 메시지를 기록하는 메서드입니다. 설정된 로그 전략에 따라 메시지를 출력합니다.
LoggerContext
클래스는 실행 중에 로그 전략을 쉽게 변경할 수 있어, 로그를 다양한 방식으로 유연하게 기록할 수 있습니다.
- LogStrategy 인터페이스:
- 역할: 모든 로그 전략 클래스가 구현해야 할 인터페이스입니다.
- 특징:
log(String message)
: 로그 메시지를 기록하는 메서드입니다. 이 메서드는 구체적인 로그 전략에 따라 다르게 구현됩니다.
- ConcreteStrategy 클래스들 (ConsoleLogStrategy, FileLogStrategy, NetworkLogStrategy):
- 역할:
LogStrategy
인터페이스의 구체적인 구현체들입니다. 각 클래스는 로그를 콘솔, 파일, 네트워크 등 특정 매체로 출력하는 전략을 구현합니다. - 특징:
log(String message)
: 실제 로그를 출력하는 구현 메서드입니다. 각 전략에 따라 다르게 구현됩니다.
- 역할: