JAVA

JAVA 디자인패턴 - 스트래티지(Strategy) 패턴

TECH 톡마스터 2023. 7. 15.

[ 목차 ]

    JAVA 디자인패턴 - 스트래티지(Strategy) 패턴
    JAVA 디자인패턴 - 스트래티지(Strategy) 패턴

    안녕하세요. 오늘은 JAVA 디자인패턴 중 스트래티지(Strategy) 패턴에 대해서 작성해 보겠습니다.

    스트래티지(Strategy) 패턴 이란?

    스트래티지 패턴은 알고리즘 군을 정의한 다음 각각을 캡슐화하여, 동적으로 상황에 따라 특정한 알고리즘을 선택하고 이용할 수 있게 해주는 행동 패턴입니다. 이 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 수정하거나 새로운 알고리즘을 추가할 수 있습니다.

    스트래티지(Strategy) 패턴 구현 방법

    스트래티지 패턴을 구현하기 위해 다음 요소들이 필요합니다.

    1. Strategy 인터페이스: 알고리즘 군에 대한 공통 인터페이스입니다.
    2. ConcreteStrategy 클래스: Strategy 인터페이스를 구현하는 각 알고리즘에 대한 클래스입니다.
    3. Context 클래스: 전략적으로 선택된 알고리즘을 사용해 작업을 처리하는 클래스입니다. 이 클래스는 Strategy 인터페이스의 참조를 사용해 알고리즘이 실행됩니다.
    // Strategy 인터페이스
    public interface SortingStrategy {
        int[] sort(int[] numbers);
    }
    
    // ConcreteStrategy 클래스
    public class BubbleSortStrategy implements SortingStrategy {
        public int[] sort(int[] numbers) {
            // 버블 정렬 구현
            int[] sortedNumbers = Arrays.copyOf(numbers, numbers.length);
            for (int i = 0; i < sortedNumbers.length; i++) {
                for (int j = 1; j < sortedNumbers.length - i; j++) {
                    if (sortedNumbers[j - 1] > sortedNumbers[j]) {
                        int temp = sortedNumbers[j - 1];
                        sortedNumbers[j - 1] = sortedNumbers[j];
                        sortedNumbers[j] = temp;
                    }
                }
            }
            return sortedNumbers;
        }
    }
    
    // Context 클래스
    public class SortingContext {
        private SortingStrategy strategy;
    
        public void setStrategy(SortingStrategy strategy) {
            this.strategy = strategy;
        }
    
        public int[] executeStrategy(int[] numbers) {
            return strategy.sort(numbers);
        }
    }
    
    // 클라이언트 코드
    public class Main {
        public static void main(String[] args) {
            int[] inputNumbers = new int[]{5, 3, 1, 4, 2};
            SortingContext sortingContext = new SortingContext();
    
            // 전략 설정 및 실행
            sortingContext.setStrategy(new BubbleSortStrategy());
            int[] sortedNumbers = sortingContext.executeStrategy(inputNumbers);
    
            System.out.println(Arrays.toString(sortedNumbers)); // 출력: [1, 2, 3, 4, 5]
        }
    }

    스트래티지(Strategy) 패턴의 장단점

    장점

    • 동일한 문제에 대해 여러 가지 해결책이 존재하는 경우 구조화된 방법으로 알고리즘을 캡슐화할 수 있습니다.
    • 알고리즘을 교체하거나 확장하는 경우 독립적으로 관리 가능합니다.
    • 클라이언트 및 Context 클래스와 알고리즘 간의 의존 관계를 분리하므로 유지하기 쉬워집니다.

    단점

    • 인터페이스를 구현하는 특정 알고리즘 개수만큼 클래스가 생성됩니다. 이로 인해 코드 복잡성이 높아질 수 있습니다.
    • 클라이언트는 context를 통해 선택된 전략에 따라 겉으로 드러나는 동작이 다른 인스턴스를 다루게 됩니다.

    스트래티지(Strategy) 패턴의 활용 예

    스트래티지 패턴은 여러 상황에서 사용할 수 있습니다.

    • 다양한 정렬 알고리즘을 제공하는 메소드를 구현할 때 (예: 버블 정렬, 퀵 정렬, 병합 정렬 등)
    • 여러 압축 기술을 지원하는 애플리케이션을 개발할 때 (예: ZIP, RAR, 7z 등)
    • 판매 시스템에서 다양한 할인 전략을 사용하여 주문을 관리할 때
    • 경로 찾기 알고리즘을 선택할 수 있는 지도 애플리케이션에서 최단 거리, 최소 시간, 최소 비용 등의 전략에 따라 결과를 제공할 때.

    스트래티지 패턴을 사용하면 이러한 전략이 구현되어 있는 클라이언트 코드와 각 알고리즘 간의 결합을 줄이기 때문에, 프로그램의 유지 관리 및 확장성이 용이해집니다.

     

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴

     

    디자인패턴 - 팩토리(Factory) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 싱글톤(Singleton) 패턴 [ 목차 ] 안녕하세요. 이번에는 팩토리(Factory) 패턴에 대해서 알아보도록 하겠습니다. 1. 팩토리(Factory) 패턴 이란? 팩토리 패턴은 객체 생성을

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴

     

    디자인패턴 - 팩토리(Factory) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 싱글톤(Singleton) 패턴 [ 목차 ] 안녕하세요. 이번에는 팩토리(Factory) 패턴에 대해서 알아보도록 하겠습니다. 1. 팩토리(Factory) 패턴 이란? 팩토리 패턴은 객체 생성을

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴

     

    디자인패턴 - 어댑터(Adapter) 패턴

    [ 목차 ] 안녕하세요. 오늘 알아볼 패턴은 어댑터(Adapter) 패턴입니다. 1. 어댑터(Adapter) 패턴 이란? 어댑터 패턴은 디자인 패턴 중 하나로, 서로 다른 인터페이스를 가진 클래스 또는 객체를 협력할

    tech.dj-tiger.com

     

    2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴

     

    디자인패턴 - 싱글톤(Singleton) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴 [ 목차 ] 안녕하세요. 자바에는 다양한 디자인 패턴이 존재하고, 각 패턴은 특정한 문제를 해결하기 위해 설계되었습니다. 적절한 디자인 패턴

    tech.dj-tiger.com

    2023.07.13 - [JAVA] - JAVA 디자인패턴 - 옵저버(Observer) 패턴

     

    JAVA 디자인패턴 - 옵저버(Observer) 패턴

    [ 목차 ] 안녕하세요. 이번에는 Java 디자인패턴 중 옵저버(Observer) 패턴에 대해서 알아보겠습니다. 1. 옵저버(Observer) 패턴이란? 옵저버 패턴은 디자인 패턴 중 하나로, 한 객체의 상태가 변화하면

    tech.dj-tiger.com

     

    2023.07.13 - [JAVA] - JAVA 디자인패턴 - 데코레이터(Decorator) 패턴

    2023.07.14 - [JAVA] - JAVA 디자인패턴 - 프록시(Proxy) 패턴

    2023.07.14 - [JAVA] - JAVA 디자인 패턴 - 커맨드(Command) 패턴

    댓글

    💲 추천 글