본문 바로가기

JAVA/디자인 패턴

[Design Pattern] Strategy(전략) 패턴이란?

반응형
행위 패턴(Behavioral Pattern)


전략 패턴(Strategy Pattern)은 객체 지향 디자인 패턴 중 하나로, 알고리즘을 정의하고, 캡슐화하며, 이를 실행 시간에 서로 교환 가능하도록 만드는 패턴입니다.

전략 패턴을 사용하면, 알고리즘의 변형이나 확장을 용이하게 할 수 있으며, 객체 간의 결합도를 낮출 수 있습니다. 즉, 전략 패턴을 사용하면 알고리즘의 변경에 따라서 코드 변경을 최소화할 수 있습니다.

전략 패턴의 핵심 요소는 전략(Strategy)입니다. 전략은 알고리즘을 캡슐화한 객체로, 클라이언트는 전략을 쉽게 교환할 수 있습니다. 즉, 전략 패턴에서는 알고리즘을 클라이언트에서 분리해 전략 객체에 위임합니다.

전략 패턴은 다음과 같은 구성 요소로 이루어집니다.

 

  • 전략(Strategy): 알고리즘을 캡슐화한 인터페이스(abstract class or interface)

  • 구체적인 전략(Concrete Strategy): 전략 인터페이스를 구현한 클래스

  • 컨텍스트(Context): 전략 객체를 사용하는 클라이언트

  • 전략 선택(Strategy Selection): 컨텍스트에서 사용할 전략 객체를 선택하는 메서드

전략 패턴의 장점은 다음과 같습니다.

 

  • 알고리즘의 변형 및 확장이 쉽습니다.

  • 코드 재사용성이 높습니다.

  • 객체 간의 결합도가 낮아져 유지보수가 용이합니다.

  • 테스트가 용이합니다.

전략 패턴은 자주 사용되는 패턴 중 하나이며, 객체 지향 디자인의 기본적인 개념을 잘 이해하고 있다면 쉽게 구현할 수 있습니다.

 

Strategy 패턴 예제

Diagrams

 

Java로 전략 패턴을 구현하는 방법을 예제 코드를 통해 설명해보겠습니다.

예를 들어, 컨텍스트(Context)에서 사용하는 전략(Strategy)은 다음과 같은 인터페이스를 구현할 수 있습니다.

public interface Strategy {
    public int execute(int a, int b);
}



여기서 'execute()' 메서드는 두 개의 정수형 매개변수를 받아서 연산을 수행한 결과를 반환하는 메서드입니다.

그리고, 구체적인 전략(Concrete Strategy)은 다음과 같은 클래스를 구현할 수 있습니다.

public class AddOperation implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a + b;
    }
}



'AddOperation' 클래스는 'execute()' 메서드를 구현하여, 두 개의 정수형 매개변수를 받아서 더한 결과를 반환합니다.

또 다른 구체적인 전략으로, 빼기 연산을 수행하는 'SubtractOperation' 클래스를 만들어 볼 수 있습니다.

public class SubtractOperation implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a - b;
    }
}



이제, 전략 선택(Strategy Selection)을 수행하는 컨텍스트(Context) 클래스를 만들어보겠습니다.

public class Context {
    private Strategy strategy;
    
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }
}



'Context' 클래스는 전략 객체를 생성자를 통해 받아서 멤버 변수에 저장합니다. 그리고, 'executeStrategy()' 메서드를 사용하여 전략 객체의 'execute()' 메서드를 호출하여 연산을 수행합니다.

이제, 전략 패턴을 사용하는 예제 코드를 만들어 보겠습니다.

public class Main {
    public static void main(String[] args) {
        // 더하기 연산을 수행하는 전략 객체 생성
        Strategy addOperation = new AddOperation();
        // 빼기 연산을 수행하는 전략 객체 생성
        Strategy subtractOperation = new SubtractOperation();
        
        // 더하기 연산을 수행하는 컨텍스트 객체 생성
        Context addContext = new Context(addOperation);
        // 빼기 연산을 수행하는 컨텍스트 객체 생성
        Context subtractContext = new Context(subtractOperation);
        
        // 더하기 연산 실행
        int result1 = addContext.executeStrategy(10, 5); // 15
        // 빼기 연산 실행
        int result2 = subtractContext.executeStrategy(10, 5); // 5
        
        System.out.println("Result1: " + result1);
        System.out.println("Result2: " + result2);
    }
}



위의 예제 코드에서는, 더하기 연산과 빼기 연산을 수행하는 두 개의 전략 객체를 생성합니다.

그리고, 더하기 연산을 수행하는 'addOperation' 전략 객체를 사용하는 'addContext' 컨텍스트 객체와, 빼기 연산을 수행하는 'subtractOperation' 전략 객체를 사용하는 'subtractContext' 컨텍스트 객체를 생성합니다.

마지막으로, 'addContext' 컨텍스트 객체에서 'executeStrategy()' 메서드를 호출하여 더하기 연산을 수행하고, 'subtractContext' 컨텍스트 객체에서 'executeStrategy()' 메서드를 호출하여 빼기 연산을 수행합니다.

그리고, 각각의 결과를 출력합니다.

전략 패턴은 상황에 따라 적절한 전략을 선택할 수 있도록 구현할 때 유용합니다. 예제 코드에서는 두 개의 연산 전략을 구현하여, 컨텍스트에서 필요한 연산을 선택할 수 있도록 구현하였습니다.

반응형