Developing Myself Everyday

전략 패턴이란?


 전략 패턴은 정책 패턴이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔 주면서 상호 교체가 가능하게 만드는 패턴이다.

 

 이 패턴은 알고리즘을 독립적인 클래스로 정의하고, 클라이언트에서는 알고리즘 클래스를 인터페이스를 톨해 사용한다. 이렇게 함으로써 클라이언트는 알고리즘의 구체적인 구현과 분리되어 유연성과 확장성을 높일 수 있다. 클라이언트는 실행 시간에 다른 알고리즘 클래스를 선택하여 사용할 수 있으며, 이를 통해 동일한 인터페이스를 가진 다양한 알고리즘을 적용할 수 있다.

 

 

 전략 패턴은 다음과 같은 장점이 있다.

  • 유연성: 알고리즘을 캡슐화하고 교체 가능하게 함으로써, 실행 시간에 알고리즘을 변경할 수 있다.
  • 확장성: 새로운 알고리즘을 추가하기 쉽고, 기존 코드에 영향을 미치지 않는다.
  • 코드 재사용: 알고리즘을 독립적인 클래스로 구현하므로, 다른 부분에서 재사용할 수 있다.
  • 테스트 용의성: 각 알고리즘 클래스를 개별적으로 테스트할 수 있다.

 

 전략 패턴은 다음과 같은 단점이 있다.

  • 복잡성: 알고리즘 클래스의 개수가 많을 수록 복잡도가 증가할 수 있다.
  • 성능 저하: 알고리즘을 동적으로 선택하므로 약간의 성능 저하가 발생할 수 있다.

 

 전략 패턴은 다음과 같은 경우에 사용하면 좋다.

  • 동일한 작업에 대해 다양한 알고리즘을 사용해야 할 때.
  • 알고리즘 선택을 클라이언트에 위임하고 싶을 때.
  • 기존 코드에 영향을 주지 않고 알고리즘을 추가하거나 변경해야 할 때.

 

 

예제


 다음은 간단하게 구현한 전략 패턴 예제이다. 아래의 예제는 간단한 int 배열을 정렬하는 Bubble Sort와 Quick Sort 알고리즘을 구현하고 있다. 자세한 정렬 알고리즘 구현은 생략하였다.

 

 SortClient (클라이언트)는 초기에 Bubble Sort를 사용해서 배열을 정렬 한 후, setSrategy 메서드를 사용하여 Quick Sort로 전략을 변경하고 다시 정렬한다. SortStrategy 인터페이스는 정렬 알고리즘을 추상화하고, 각각의 전략을 구현하는 클래스는 SortStrategy 인터페이스를 상속받아 구현한다. 이를 통해 클라이언트는 알고리즘의 구체적인 구현과 분리되어 동일한 인터페이스를 통해 다른 정렬 알고리즘을 사용할 수 있다.

 

 

Kotlin

// 전략 인터페이스
interface SortStrategy {
    fun sort(arr: IntArray)
}

// 전략 구현 클래스들
class BubbleSortStrategy : SortStrategy {
    override fun sort(arr: IntArray) {
        println("Bubble Sort")
        // Bubble Sort 알고리즘 구현
    }
}

class QuickSortStrategy : SortStrategy {
    override fun sort(arr: IntArray) {
        println("Quick Sort")
        // Quick Sort 알고리즘 구현
    }
}

// 클라이언트
class SortClient(private var strategy: SortStrategy) {
    fun setStrategy(strategy: SortStrategy) {
        this.strategy = strategy
    }

    fun executeSort(arr: IntArray) {
        strategy.sort(arr)
    }
}

// 사용 예제
fun main() {
    val arr = intArrayOf(5, 2, 7, 1, 3)

    val bubbleSort = BubbleSortStrategy()
    val quickSort = QuickSortStrategy()

    val client = SortClient(bubbleSort)
    client.executeSort(arr)

    client.setStrategy(quickSort)
    client.executeSort(arr)
}
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!