공부/자바
전략 디자인 패턴
확두뇌
2024. 2. 6. 10:50
전략 디자인 패턴이란?
전략 디자인 패턴(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);
}
}
전략 패턴 특징
전략 패턴 사용 시기
- 전략 알고리즘의 여러 버전 또는 변형이 필요할 때 클래스화를 통해 관리
- 알고리즘 코드가 노출되어서는 안 되는 데이터에 액세스 하거나 데이터를 활용할 때 (캡슐화)
- 알고리즘의 동작이 런타임에 실시간으로 교체 되어야 할때
전략 패턴 주의점
- 알고리즘이 많아질수록 관리해야할 객체의 수가 늘어난다는 단점이 있다.
- 만일 어플리케이션 특성이 알고리즘이 많지 않고 자주 변경되지 않는다면, 새로운 클래스와 인터페이스를 만들어 프로그램을 복잡하게 만들 이유가 없다.
- 개발자는 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다. (복잡도 ↑)