본문 바로가기
Java

[Java] Interface/Abstract Class 실무 활용 패턴 - Part 2: 전략 패턴 (Strategy Pattern)

by clolee 2025. 5. 7.

✅ Part 2: 전략 패턴 (Strategy Pattern)


📌 1. 개념 요약

전략 패턴(Strategy Pattern)행위(로직/알고리즘)를 객체화해서 외부에서 주입하고 교체할 수 있도록 만든 구조입니다.

즉, 어떤 기능(전략)이 상황에 따라 달라져야 할 때,

  • 조건문(if/else) 대신
  • 전략 인터페이스 + 구현체를 만들어
  • 필요 시점에 교체해서 실행

🔧 2. 구조 및 키포인트

[인터페이스]          : 전략 규칙 정의
[구현 클래스들]       : 전략별 로직 분리
[컨텍스트 객체]       : 전략을 주입받아 실행
  • 실행을 담당하는 컨텍스트 객체는 전략에 대해 알지 못함
  • 전략 인터페이스만 알고 있으므로 전략 교체가 자유로움

✅ 3. 예제: 정렬 알고리즘 선택

🔹 전략 인터페이스

interface SortStrategy {
    void sort(List<String> list);
}

🔹 구현 클래스 1: 버블 정렬

class BubbleSort implements SortStrategy {
    public void sort(List<String> list) {
        System.out.println("버블 정렬 알고리즘 수행");
    }
}

🔹 구현 클래스 2: 퀵 정렬

class QuickSort implements SortStrategy {
    public void sort(List<String> list) {
        System.out.println("퀵 정렬 알고리즘 수행");
    }
}

🔹 컨텍스트 클래스: 전략 실행자

class SortService {
    private SortStrategy strategy;

    public SortService(SortStrategy strategy) {
        this.strategy = strategy;
    }

    public void executeSort(List<String> list) {
        strategy.sort(list);
    }
}

🔹 실행 코드

public class Main {
    public static void main(String[] args) {
        List<String> data = List.of("C", "A", "B");

        SortService bubbleService = new SortService(new BubbleSort());
        bubbleService.executeSort(data);

        SortService quickService = new SortService(new QuickSort());
        quickService.executeSort(data);
    }
}

🧠 4. 실무 적용 포인트

실무 상황 전략 패턴 도입 효과
정책마다 처리 방식이 달라야 할 때 if/else 대신 구현체 분리
기능을 외부에서 바꿔서 넣고 싶을 때 동적으로 전략 교체 가능
테스트, 유지보수 편하게 하고 싶을 때 전략을 Mock으로 대체 가능
예시: 할인 정책, 추천 알고리즘, 로그인 방식 Strategy로 구현 클래스 분리

🛠️ 5. 확장: Spring DI + 전략 패턴

@Component
public class EmailNotification implements NotificationStrategy {
    public void send(String message) {
        System.out.println("이메일 발송: " + message);
    }
}
@Service
public class NotificationService {
    private final NotificationStrategy strategy;

    public NotificationService(NotificationStrategy strategy) {
        this.strategy = strategy;
    }

    public void notifyUser(String msg) {
        strategy.send(msg);
    }
}
  • Spring에서는 전략을 빈(Bean) 으로 관리하고 자동 주입할 수 있음
  • 테스트 시에는 다른 전략으로 교체도 손쉬움 (Mock, Stub, 다른 구현체 등)

📝 6. 정리

항목 설명
설계 목적 로직을 외부로 분리해 교체/확장 가능하게 함
구성 요소 인터페이스 + 구현체 + 실행 컨텍스트
효과 조건문 제거, 테스트 용이성, 전략 교체 용이
실무 사용 예 할인 정책, 정렬, 필터링, 결제 수단, 인코딩 방식, 알림 방식 등

댓글