JAVA

[JAVA] 전략 패턴(Strategy Pattern)이란?

sagecode 2025. 5. 23. 15:15

전략 패턴이란?

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

 

예를 들면 유저가 결제방식을 결정할 때 '신용카드', '카카오페이', '현금' 등 여러가지 방법으로 결제를 하게된다.

public interface Payment {
    void pay(int amount);
}

일단 amount만큼의 금액을 지불한다는 pay() 추상 메소드를 Payment 인터페이스에 구현한다.

 

public class KakaoPayment implements Payment {

    @Override
    public void pay(int amount) {
        System.out.println(amount + "원을 카카오페이로 지불합니다.");
    }
}

public class CreditCardPayment implements Payment {

    @Override
    public void pay(int amount) {
        System.out.println(amount + "원을 신용카드로 지불합니다.");
    }
}

public class CashPayment implements Payment {

    @Override
    public void pay(int amount) {
        System.out.println(amount + "원을 현금으로 지불합니다.");
    }
}

이렇게 결제방식(Payment)를 구현해 줄 수 있는 전략들(구현체)을 구현해준다. 그 때 각각 구현체마다 pay()의 내용들이 다르다.

 

public class Main {
    public static void main(String[] args) {
        Payment kakao;
        kakao = new KakaoPayment();

        Payment creditCard;
        creditCard = new CreditCardPayment();
        
        Payment cash;
        cash = new CashPayment();

        kakao.pay(300); // 300원을 카카오페이로 지불합니다.
        creditCard.pay(400); // 400원을 신용카드로 지불합니다.
        cash.pay(500); // 500원을 현금으로 지불합니다.
    }
}

 

전략 패턴의 장점

  • 행위(알고리즘)를 캡슐화하여 분리할 수 있다
    • Payment 인터페이스를 통해 결제 방식이라는 공통적인 행위를 정의하고, 각 구현체는 개별 전략으로 캡슐화 됨
  • 기존 코드를 수정하지 않고 새로운 전략을 추가할 수 있다
    • 예를 들어 ApplePayPayment라는 새로운 결제 방식을 도입하려면 기존 코드를 건드릴 필요 없이 Payment 인터페이스만 구현하면 됨
    • OCP(개방-폐쇄 원칙)를 잘 지킴

전략 패턴의 단점

  • 클래스 수가 많아진다.
    • 결제 방식 하나마다 별도의 클래스를 만들어야 하기 때문에 전략이 많아질수록 클래스 수가 증가하여 관리가 어려울 수 있다.