Spring/아키텍처, 설계

전략 패턴(Strategy Pattern)

가지코딩 2025. 6. 18. 18:15

전략 패턴(Strategy Pattern)이란?

  • 행동(알고리즘, 로직)을 캡슐화하여 런타임에 자유롭게 교체할 수 있게 하는 디자인 패턴
  • 여러 가지 방식 중 하나를 선택해 실행할 수 있도록 전략(전략 객체)을 분리하고, 이를 사용하는 컨텍스트가 전략을 교체하며 유연하게 동작하게 만든다.

전략 패턴의 필요성

 

단순 인터페이스 사용 시 발생되는 문제점

interface Moveable {
    void move();
}

class WalkCharacter implements Moveable {
    public void move() { System.out.println("걷는다"); }
}

class SwimCharacter implements Moveable {
    public void move() { System.out.println("수영한다"); }
}
// 클라이언트 사용 예
public class Main {
    public static void main(String[] args) {
        Moveable character1 = new WalkCharacter();
        character1.move(); // 걷는다.

        Moveable character2 = new SwimCharacter();
        character2.move(); // 수영한다.
    }
}

 

 

1. 행동을 동적으로 바꿀 수 없다.

  • 행동을 바꾸고 싶다면, 객체 자체를 바꾸거나 새로 생성해야 한다.
  • 즉, 런타임에 자유롭게 행동 변경할 수 없다.
Moveable character1 = new WalkCharacter();
character1.move(); // 걷는다.

character1 = new SwimCharacter();
character1.move(); // 수영한다.

 

 

2. OCP(Open-Closed Principle, 개방-폐쇄 원칙) 위반

  • 새로운 행동을 추가하거나 변경하기 위해 기존 클래스를 수정하거나 새로운 클래스를 생성해야 한다.
  • 이는 "기존 코드를 변경하지 않고 기능을 확장해야 한다"는 OCP의 원칙에 위배된다.

전략 패턴 구조

 

주요 구성 요소

  • 전략 인터페이스(Strategy Interface)
    • 인터페이스는 특정 행동을 수행하는 메서드의 틀을 정의한다.
    • 다양한 구체 전략 클래스들이 이 인터페이스를 구현한다.
    • ex. MoveStrategy
  • 구체 전략(Concrete Strategy)
    • 각각의 구체 전략 클래스는 전략 인터페이스를 구현해 특정 행동이나 알고리즘을 정의한다.
    • ex. WalkStrategy, SwimStrategy
  • 컨텍스트(Context)
    • 컨텍스트는 전략 인터페이스를 참조하고, 필요에 따라 실행 중에 전략 객체를 교체할 수 있다.
    • 자신의 동작을 구체 전략에 위임하여 실행한다.
    • ex. Character

전략 패턴 예시

// 전략 인터페이스
interface MoveStrategy {
    void move();
}

// 전략 구현체
class WalkStrategy implements MoveStrategy {
    public void move() {
        System.out.println("걷는다.");
    }
}

class SwimStrategy implements MoveStrategy {
    public void move() {
        System.out.println("수영한다.");
    }
}

// 컨텍스트 클래스
class Character {
    private MoveStrategy moveStrategy;

    public Character(MoveStrategy moveStrategy) {
        this.moveStrategy = moveStrategy;
    }

    public void setMoveStrategy(MoveStrategy moveStrategy) {
        this.moveStrategy = moveStrategy;
    }

    public void move() {
        moveStrategy.move();
    }
}

 

클라이언트 사용 예

public class Main {
    public static void main(String[] args) {
        Character character = new Character(new WalkStrategy());
        character.move(); // 걷는다.

        // 전략 교체 (런타임에 행동 변경)
        character.setMoveStrategy(new SwimStrategy());
        character.move(); // 수영한다.
    }
}

전략 패턴의 장단점

 

장점

  • 행동을 동적으로 교체 가능
  • 클래스 폭발 문제 완화- 유지보수와 테스트가 용이
  • 책임 분리 및 코드 재사용성 증가
  • OCP(개방-폐쇄 원칙) 준수

 

단점

  • 클래스 수가 증가하여 관리가 어려워질 수 있음
  • 단순한 문제에 적용 시 구조가 복잡해질 수 있음
  • 전략 선택 및 관리 책임이 분산될 수 있음
  • 전략 간 상호작용이 필요한 경우 조율이 어려울 수 있음

참고 자료

 

https://victorydntmd.tistory.com/292

 

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

전략 패턴 ( Strategy Pattern )객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여,객체의 행위를 동적으로 바꾸고 싶은 경우 직접

victorydntmd.tistory.com

 

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%A0%84%EB%9E%B5Strategy-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

 

💠 전략(Strategy) 패턴 - 완벽 마스터하기

Strategy Pattern 전략 패턴은 실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴 이다. 여기서 '전략'이란 일종의 알고리즘이 될 수

inpa.tistory.com