Search

전략 패턴

개요

전략 패턴은 객체 지향 프로그래밍에서 동일한 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고, 이들을 각자 상호 교환 가능한 것으로 정의하는 패턴입니다. 전략 패턴을 사용하면 실행 시점에 알고리즘을 선택할 수 있으므로, 알고리즘의 선택에 따라 객체의 행동이 달라집니다.

주요 섹션

전략 패턴은 크게 다음과 같은 세 가지 섹션으로 나눌 수 있습니다.
1.
Strategy(전략) 인터페이스: 전략 패턴에서 사용되는 알고리즘을 정의하는 인터페이스입니다. 이 인터페이스는 일반적으로 하나의 메서드만을 가지고 있습니다.
2.
ConcreteStrategy(구체적 전략) 클래스: Strategy 인터페이스를 구현하는 클래스입니다. 즉, 전략 패턴에서 사용되는 실제 알고리즘을 구현하는 클래스입니다.
3.
Context(컨텍스트) 클래스: 전략 패턴에서 Strategy 인터페이스를 구현하는 ConcreteStrategy 클래스들을 사용하는 클래스입니다. 즉, Context 클래스는 Strategy 인터페이스를 구현한 ConcreteStrategy 클래스의 객체를 생성하고, 이를 사용하는 역할을 합니다.

예제 코드

다음은 전략 패턴의 예제 코드입니다.
// Strategy 인터페이스 interface Strategy { public int doOperation(int num1, int num2); } // ConcreteStrategy 클래스 class OperationAdd implements Strategy { public int doOperation(int num1, int num2) { return num1 + num2; } } class OperationSubtract implements Strategy { public int doOperation(int num1, int num2) { return num1 - num2; } } class OperationMultiply implements Strategy { public int doOperation(int num1, int num2) { return num1 * num2; } } // Context 클래스 class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } } // 실행 public class Main { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubtract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
Java
복사
위 예제 코드에서는 Strategy 인터페이스를 정의하고, 이를 구현한 ConcreteStrategy 클래스(OperationAdd, OperationSubtract, OperationMultiply)를 정의합니다. 또한, Context 클래스에서는 Strategy 인터페이스를 구현한 ConcreteStrategy 클래스의 객체를 생성하고, 이를 사용합니다. 이렇게 구현된 전략 패턴은 실행 시점에 알고리즘을 선택할 수 있습니다.

장단점

전략 패턴은 다음과 같은 장점을 가집니다.
객체 지향 설계 원칙 중 하나인 개방-폐쇄 원칙(OCP)을 준수합니다. 전략 패턴을 사용하면 알고리즘을 변경하더라도 Context 클래스를 변경할 필요가 없습니다. 대신에 새로운 ConcreteStrategy 클래스를 구현하면 됩니다.
전략 패턴을 사용하면 알고리즘을 교체하기 쉬워집니다. 즉, 실행 시점에 알고리즘을 선택할 수 있으므로, 유연한 코드를 작성할 수 있습니다.
전략 패턴을 사용하면 비슷한 알고리즘을 다수 사용할 때 코드의 중복을 방지할 수 있습니다.
하지만, 전략 패턴은 다음과 같은 단점도 가집니다.
전략 패턴을 사용하면 객체의 수가 늘어나게 됩니다. 각 ConcreteStrategy 클래스는 하나의 알고리즘을 구현하므로, 많은 ConcreteStrategy 클래스가 필요할 수 있습니다.
전략 패턴을 사용하면 코드가 복잡해질 수 있습니다. 전략 패턴을 사용하면 클래스 수가 많아지므로, 코드의 가독성이 떨어질 수 있습니다.

결론

전략 패턴은 객체 지향 프로그래밍에서 동일한 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고, 이들을 각자 상호 교환 가능한 것으로 정의하는 패턴입니다. 전략 패턴을 사용하면 실행 시점에 알고리즘을 선택할 수 있으므로, 알고리즘의 선택에 따라 객체의 행동이 달라집니다. 전략 패턴은 OCP를 준수하며, 알고리즘을 교체하기 쉬우므로 유연한 코드를 작성할 수 있습니다. 하지만, 전략 패턴을 사용하면 객체의 수가 늘어나며, 코드가 복잡해질 수 있습니다.