-
전략 디자인 패턴이란?
전략 디자인 패턴(Strategy Design Pattern)은 객체 지향 소프트웨어 디자인에서 사용되는 패턴 중 하나로, 알고리즘을 정의하고 각각의 알고리즘을 캡슐화하여 서로 교환 가능하도록 만듭니다. 이 패턴은 알고리즘을 독립적으로 변경하고 클라이언트에 영향을 주지 않고 새로운 알고리즘을 추가할 수 있도록 합니다.
전략 패턴은 OOP의 집합체
GoF의 디자인 패턴 책에서는 전략 패턴을 다음과 같이 정의한다.
- 동일 계열의 알고리즘군을 정의하고
- 각각의 알고리즘을 캡슐화하여
- 이들을 상호 교환이 가능하도록 만든다.
- 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로
- 알고리즘을 다양하게 변경할 수 있게 한다.
예시
1. 간단한 정렬 알고리즘을 다양한 전략으로 교체할 수 있는 상황을 자바 코드로 표현
// 전략 인터페이스 interface SortingStrategy { void sort(int[] array); } // 구체적인 전략 클래스들 class BubbleSort implements SortingStrategy { @Override public void sort(int[] array) { // Bubble sort implementation System.out.println("Bubble Sort"); } } class QuickSort implements SortingStrategy { @Override public void sort(int[] array) { // Quick sort implementation System.out.println("Quick Sort"); } } class MergeSort implements SortingStrategy { @Override public void sort(int[] array) { // Merge sort implementation System.out.println("Merge Sort"); } } // 컨텍스트 클래스 class SortingContext { private SortingStrategy sortingStrategy; public SortingContext(SortingStrategy sortingStrategy) { this.sortingStrategy = sortingStrategy; } public void setSortingStrategy(SortingStrategy sortingStrategy) { this.sortingStrategy = sortingStrategy; } public void performSort(int[] array) { sortingStrategy.sort(array); } } // 클라이언트 코드 public class StrategyPatternExample { public static void main(String[] args) { int[] arrayToSort = {5, 2, 9, 1, 5}; // 초기 전략: Bubble Sort SortingStrategy initialStrategy = new BubbleSort(); SortingContext sortingContext = new SortingContext(initialStrategy); // 클라이언트가 원하는 전략으로 교체 sortingContext.performSort(arrayToSort); // 새로운 전략: Quick Sort SortingStrategy newStrategy = new QuickSort(); sortingContext.setSortingStrategy(newStrategy); sortingContext.performSort(arrayToSort); } }
2. 자바의 sort를 compare 메소드 override로 구현
class StrategyInJava { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); numbers.add(2); numbers.add(1); numbers.add(3); numbers.add(5); numbers.add(4); // sort 메서드의 매개변수로 익명 클래스로 Comparator 객체를 인스턴스화하여 // 그 안의 compare 메서드 동작 로직(ConcreteStrategy)를 직접 구현하여 할당하는 것을 볼 수 있다. Collections.sort(numbers, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); System.out.println(numbers); } }
전략 패턴 특징
전략 패턴 사용 시기
- 전략 알고리즘의 여러 버전 또는 변형이 필요할 때 클래스화를 통해 관리
- 알고리즘 코드가 노출되어서는 안 되는 데이터에 액세스 하거나 데이터를 활용할 때 (캡슐화)
- 알고리즘의 동작이 런타임에 실시간으로 교체 되어야 할때
전략 패턴 주의점
- 알고리즘이 많아질수록 관리해야할 객체의 수가 늘어난다는 단점이 있다.
- 만일 어플리케이션 특성이 알고리즘이 많지 않고 자주 변경되지 않는다면, 새로운 클래스와 인터페이스를 만들어 프로그램을 복잡하게 만들 이유가 없다.
- 개발자는 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다. (복잡도 ↑)
'자바' 카테고리의 다른 글
SQL 튜닝 (3) 2024.03.05 Builder 디자인 패턴 (1) 2024.02.13 TDD (2) 2024.01.22 Spring boot3에서 Swagger Springdoc 사용하기 - maven (1) 2024.01.09 java 예외처리 throws와 try ~ catch 차이점 (1) 2023.12.13