[파이썬] 전략 패턴과 알고리즘 교체

애플리케이션을 개발할 때, 종종 알고리즘을 변경해야 할 때가 있습니다. 이때 전략 패턴은 유용한 설계 패턴 중 하나입니다. 전략 패턴은 다양한 알고리즘을 정의하고 캡슐화하여 실행 시에 알고리즘을 교체하는 것을 가능하게 해줍니다. 이는 유지 보수성과 확장성을 높이는 데 도움이 됩니다.

전략 패턴의 구조

전략 패턴은 세 가지 주요 구성 요소로 이루어져 있습니다.

  1. 전략(Strategy): 다양한 알고리즘을 추상화하고 캡슐화한 인터페이스 또는 추상 클래스입니다. 이 인터페이스는 알고리즘을 실행하는 메서드를 정의합니다.

  2. 구체적인 전략(Concrete Strategy): 전략 인터페이스를 구현한 구체적인 알고리즘 클래스입니다. 각 구체적인 전략 클래스는 특정한 알고리즘을 구현하고, 전략 인터페이스의 메서드를 오버라이드합니다.

  3. 컨텍스트(Context): 전략 객체를 사용하는 클라이언트를 나타내는 클래스입니다. 이 컨텍스트 클래스는 전략 객체를 유지하고, 컨텍스트 자체의 기능을 위해 전략 객체를 호출합니다.

다음은 전략 패턴의 간단한 예제입니다. 이 예제에서는 선택 정렬과 삽입 정렬 알고리즘을 전략으로 사용하여 리스트를 정렬합니다.

# 전략(Strategy) 인터페이스
class SortStrategy:
    def sort(self, data):
        raise NotImplementedError

# 구체적인 전략(Concrete Strategy) 클래스
class SelectionSortStrategy(SortStrategy):
    def sort(self, data):
        print("Using Selection Sort")
        # 선택 정렬 알고리즘을 구현하고 실행

class InsertionSortStrategy(SortStrategy):
    def sort(self, data):
        print("Using Insertion Sort")
        # 삽입 정렬 알고리즘을 구현하고 실행

# 컨텍스트(Context) 클래스
class Sorter:
    def __init__(self, strategy):
        self.strategy = strategy

    def sort_data(self, data):
        self.strategy.sort(data)

# 클라이언트 코드
data = [5, 2, 7, 1, 9]

sorter = Sorter(SelectionSortStrategy())
sorter.sort_data(data)
# 출력: Using Selection Sort

sorter.strategy = InsertionSortStrategy()
sorter.sort_data(data)
# 출력: Using Insertion Sort

위의 예제에서, SortStrategy는 전략 인터페이스로서 sort 메서드 하나를 가지고 있습니다. SelectionSortStrategyInsertionSortStrategySortStrategy를 구현하는 구체적인 전략 클래스입니다. Sorter는 컨텍스트 클래스로서 strategy 변수에 전략 객체를 유지하고, sort_data 메서드를 통해 전략 객체의 sort 메서드를 호출합니다.

알고리즘 교체

전략 패턴의 주요 장점 중 하나는 실행 시에 알고리즘을 교체할 수 있다는 것입니다. 위의 예제에서는 sorter.strategy를 통해 알고리즘을 교체할 수 있습니다.

예를 들어, Sorter 객체가 생성된 후에도 언제든지 특정 시점에서 다른 알고리즘으로 변경될 수 있습니다.

# 클라이언트 코드
sorter = Sorter(SelectionSortStrategy())
sorter.sort_data(data)
# 출력: Using Selection Sort

# 다른 알고리즘으로 교체
sorter.strategy = InsertionSortStrategy()
sorter.sort_data(data)
# 출력: Using Insertion Sort

알고리즘을 교체할 때는 클라이언트 코드의 변경 없이도 새로운 알고리즘을 사용할 수 있습니다. 이는 애플리케이션의 유연성과 확장성을 향상시키는데 도움이 됩니다.

전략 패턴은 알고리즘 교체를 간단하게 만들어주는 강력한 디자인 패턴입니다. 파이썬과 같은 유연한 프로그래밍 언어에서는 전략 패턴을 활용하여 코드를 깔끔하게 유지하고, 알고리즘 변경에 대비하는 것이 중요합니다.