본문 바로가기
Java&Spring

[디자인 패턴] 전략 패턴 [Strategy Pattern]

by JINJINC 2025. 1. 16.
728x90
반응형
Strategy Pattern

전략 패턴 (Strategy Pattern)

전략 패턴(Strategy Pattern)은 행동(알고리즘)을 캡슐화하여 동적으로 변경하거나 선택할 수 있도록 도와주는 디자인 패턴입니다. 객체의 행동을 별도의 클래스로 분리하여 실행 중에 행동을 교체할 수 있게 합니다. 이 패턴은 개방-폐쇄 원칙(Open/Closed Principle)을 따르며, 코드를 확장하기 쉽게 설계할 수 있습니다.

전략 패턴의 구성 요소

  1. Context (문맥 클래스): 클라이언트가 사용하는 클래스이며, 특정 전략(알고리즘)을 사용하는 역할을 합니다. 전략 객체를 주입받아 사용하며, 주입된 전략에 따라 동작이 결정됩니다.
  2. Strategy (전략 인터페이스): 공통 인터페이스로, 다양한 전략들이 구현해야 할 메서드를 정의합니다. 여러 구현체들이 공통된 메서드 이름을 가지며, 각각 다른 방식으로 동작합니다.
  3. Concrete Strategy (구체적인 전략): 전략 인터페이스를 구현한 클래스들입니다. 각 클래스는 특정 알고리즘이나 행동을 구현합니다.

코드 예제: 전략 패턴 구현

1. 전략 인터페이스


// 인코딩 전략 인터페이스
interface EncodingStrategy {
    String encode(String text);
}
    

2. 구체적인 전략


import java.util.Base64;

// Base64 인코딩 전략
class Base64Strategy implements EncodingStrategy {
    @Override
    public String encode(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }
}

// 일반 텍스트 그대로 반환하는 전략
class NormalStrategy implements EncodingStrategy {
    @Override
    public String encode(String text) {
        return text;
    }
}

// 텍스트 앞에 "ABC"를 추가하는 전략
class AppendStrategy implements EncodingStrategy {
    @Override
    public String encode(String text) {
        return "ABC" + text;
    }
}
    

3. Context (문맥 클래스)


class Encoder {

    private EncodingStrategy encodingStrategy;

    // 전략 설정 메서드 (Setter 방식)
    public void setEncodingStrategy(EncodingStrategy encodingStrategy) {
        this.encodingStrategy = encodingStrategy;
    }

    // 전략을 실행하여 결과 반환
    public String encode(String message) {
        return encodingStrategy.encode(message);
    }
}
    

4. 클라이언트 코드


public class StrategyTest {
    public static void main(String[] args) {
        EncodingStrategy base64 = new Base64Strategy();
        EncodingStrategy normal = new NormalStrategy();
        EncodingStrategy append = new AppendStrategy();

        String message = "1234";

        Encoder encoder = new Encoder();

        encoder.setEncodingStrategy(base64);
        String result = encoder.encode(message);
        System.out.println("Base64: " + result);

        encoder.setEncodingStrategy(normal);
        result = encoder.encode(message);
        System.out.println("Normal: " + result);

        encoder.setEncodingStrategy(append);
        result = encoder.encode(message);
        System.out.println("Append: " + result);
    }
}
    

실행 결과


Base64: MTIzNA==
Normal: 1234
Append: ABC1234
    

전략 패턴의 장점

  • 행동의 캡슐화: 특정 행동(알고리즘)을 캡슐화하여 코드 변경 없이 새로운 전략을 쉽게 추가할 수 있습니다.
  • 유연성: 런타임 시 전략을 변경할 수 있어 동적인 요구 사항에 대응할 수 있습니다.
  • 확장성: 새로운 전략(구체적인 클래스)을 추가하더라도 기존 코드에 영향을 주지 않습니다.
  • 코드 재사용성: 공통 인터페이스를 기반으로 다양한 전략을 구현하면 코드의 재사용성을 높일 수 있습니다.

전략 패턴을 사용하면 좋은 경우

  • 행동이 자주 변경될 때: 특정 행동이나 알고리즘이 자주 변경되는 경우, 전략 패턴을 통해 변경 사항을 효과적으로 관리할 수 있습니다.
  • 동적으로 행동을 선택해야 할 때: 실행 중에 행동을 변경하거나 선택해야 하는 경우.
  • 조건문(분기문)이 많을 때: if-elseswitch문이 많은 코드를 전략 패턴으로 단순화할 수 있습니다.

전략 패턴의 단점

  • 복잡성 증가: 전략 클래스가 많아질수록 코드 구조가 복잡해질 수 있습니다.
  • 클래스 수 증가: 전략을 캡슐화하는 클래스가 늘어나기 때문에 관리가 어려워질 수 있습니다.

전략 패턴은 다양한 알고리즘과 행동을 캡슐화하여 동적으로 변경할 수 있는 유연한 구조를 제공합니다. 특히, 비즈니스 로직에서 행동이 자주 변경되거나 조건문이 많아지는 경우 전략 패턴을 적용하여 코드의 유지보수성과 가독성을 높일 수 있습니다.

728x90
반응형

댓글