카테고리 없음

10. Strategy - 알고리즘을 모두 바꾼다

조요피 2023. 10. 13. 10:31

10. Strategy - 알고리즘을 모두 바꾼다

스트래티지(Strategy) 패턴은 소프트웨어 디자인에서 사용되는 객체 지향 디자인 패턴 중 하나로, 특정한 작업을 수행하는 알고리즘을 정의하고, 해당 알고리즘을 독립적으로 교체하여 사용할 수 있도록 하는
패턴입니다. 이 패턴은 행위(Behavioral) 디자인 패턴 중 하나로 분류됩니다.

스트래티지 패턴의 핵심 아이디어는 알고리즘을 사용하는 클라이언트와 알고리즘 자체를 분리하는 것입니다. 이렇게 하면 클라이언트는 실행 중에 다양한 알고리즘을 선택할 수 있고, 새로운 알고리즘을 추가하거나 기존
알고리즘을 변경하는 데 용이해집니다.

스트래티지 패턴의 주요 구성 요소는 다음과 같습니다:

  1. Context (콘텍스트): 클라이언트가 사용하는 알고리즘을 정의하고, 알고리즘을 실행하는 역할을 합니다. 콘텍스트는 알고리즘을 교체할 수 있어야 하며, 이를 위해 알고리즘을 참조할 수 있는 인터페이스를 가지고
    있어야 합니다.

  2. Strategy (스트래티지): 실제로 수행되는 알고리즘을 나타내는 인터페이스 또는 추상 클래스입니다. 다양한 알고리즘은 이 스트래티지 인터페이스를 구현합니다.

  3. ConcreteStrategy (구체적인 스트래티지): 스트래티지 인터페이스를 구현한 실제 알고리즘 클래스들입니다. 다양한 구체적인 스트래티지 클래스가 있으며, 클라이언트가 이 중 하나를 선택하여 콘텍스트에
    적용할 수 있습니다.

스트래티지 패턴은 다음과 같은 이점을 제공합니다:

  • 알고리즘의 독립성: 각 알고리즘은 자체로 독립적으로 변경될 수 있으며, 클라이언트 코드에 영향을 주지 않고 새로운 알고리즘을 추가할 수 있습니다.
  • 코드 재사용: 여러 컨텍스트에서 동일한 알고리즘을 사용할 수 있으므로 코드 재사용이 용이합니다.
  • 유지 보수성: 알고리즘의 변경은 해당 알고리즘과 관련된 클래스에만 영향을 미치므로 유지 보수가 편리합니다.

스트래티지 패턴은 실제로 많은 소프트웨어 시스템에서 사용되며, 예를 들어 정렬 알고리즘, 가격 계산, UI 동작 등의 다양한 상황에서 적용됩니다.

예제

스트래티지 패턴의 간단한 예제 코드를 아래에 제시합니다. 이 예제에서는 동물의 울음 소리를 다르게 하는 스트래티지 패턴을 사용합니다.

먼저, 스트래티지 인터페이스를 정의합니다:

// 스트래티지 인터페이스
interface SoundStrategy {
    void makeSound();
}

다음으로, 스트래티지 인터페이스를 구현하는 구체적인 스트래티지 클래스들을 작성합니다:

// 구체적인 스트래티지 클래스들
class BarkSound implements SoundStrategy {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

class MeowSound implements SoundStrategy {
    @Override
    public void makeSound() {
        System.out.println("야옹!");
    }
}

그리고 스트래티지를 사용하는 컨텍스트 클래스를 작성합니다:

// 컨텍스트 클래스
class Animal {
    private SoundStrategy soundStrategy;

    public void setSoundStrategy(SoundStrategy soundStrategy) {
        this.soundStrategy = soundStrategy;
    }

    public void makeSound() {
        if (soundStrategy != null) {
            soundStrategy.makeSound();
        }
    }
}

이제 클라이언트 코드에서 스트래티지 패턴을 사용할 수 있습니다:

public class Main {
    public static void main(String[] args) {
        Animal dog = new Animal();
        Animal cat = new Animal();

        dog.setSoundStrategy(new BarkSound());
        cat.setSoundStrategy(new MeowSound());

        dog.makeSound(); // "멍멍!" 출력
        cat.makeSound(); // "야옹!" 출력
    }
}

위 예제에서, Animal 클래스는 스트래티지 패턴을 활용하여 울음 소리를 다르게 만들 수 있습니다. 클라이언트는 setSoundStrategy 메서드를 통해 다른 스트래티지(울음 소리)를
선택하고, makeSound 메서드를 호출하면 선택한 스트래티지에 따라 다른 울음 소리가 출력됩니다.