전략 패턴(Strategy Pattern)

박세건·2024년 5월 25일
0

디자인 패턴

목록 보기
16/17
post-thumbnail

전략 패턴이란, 런타임 중에 알고리즘 전략을 선택해서 동작을 실시간으로 바꿔줄 수 있게 해주는 행위 디자인 패턴이다.
전략 : 특정한 기능이나 동작으로 특정한 목표를 수행하기 위한 행동 계획
여러가지 알고리즘 전략을 미리 정의해놓고 교체하면서 사용하는 패턴

구조

  • Context : 전략에 따른 메서드를 호출
  • Strategy : 전략을 추상화시킨 클래스, 최상위 클래스
  • ConcreteStrategy : 하위 전략 클래스
    Context : 무엇인가를 핸들링하기위한 접근 수단

전략패턴은 OOP의 집합체

전략패턴은 지금까지 우리가 Java를 공부하면서 배운 문법, 특징, SOILD, OOP 기술 들의 집합버전이라고 생각함면된다.
모든 기술들이 종합적으로 사용되는 집합체

예시 코드

전략 설정

// 전략(추상화된 알고리즘)
interface IStrategy {
    void doSomething();
}

// 전략 알고리즘 A
class ConcreteStrateyA implements IStrategy {
    public void doSomething() {}
}

// 전략 알고리즘 B
class ConcreteStrateyB implements IStrategy {
    public void doSomething() {}
}

컨텍스트 객체 설정

// 컨텍스트(전략 등록/실행)
class Context {
    IStrategy Strategy; // 전략 인터페이스를 합성(composition)
	
    // 전략 교체 메소드
    void setStrategy(IStrategy Strategy) {
        this.Strategy = Strategy;
    }
	
    // 전략 실행 메소드
    void doSomething() {
        this.Strategy.doSomething();
    }
}

실행문

// 클라이언트(전략 교체/전략 실행한 결과를 얻음)
class Client {
    public static void main(String[] args) {
        // 1. 컨텍스트 생성
        Context c = new Context();

        // 2. 전략 설정
        c.setStrategy(new ConcreteStrateyA());

        // 3. 전략 실행
        c.doSomething();

        // 4. 다른 전략 설정
        c.setStrategy(new ConcreteStrateyB());

        // 5. 다른 전략 시행
        c.doSomething();
    }
}
  • 전략을 갖고 메서드를 실행시키는 Context
  • Context는 같은 행동을 반복하지만 변경된 전략에 따라 다른 기능이 실행

와, 정말 핵심을 찌르는 질문이야!
정확하게 말하면,

맞아! 전략 패턴의 핵심은 "상속이 아니라 합성(composition)"을 사용하는 것이야.


✅ 왜 합성을 사용하는가?

✅ 상속 vs 합성

구분상속(Inheritance)합성(Composition)
구조"is-a" 관계"has-a" 관계
변경컴파일 시 결정 (고정적)런타임에 동적으로 변경 가능
재사용성낮음높음
유연성낮음높음

✅ 전략 패턴에서 합성 사용

전략 패턴은 이렇게 작성하지 않는다:

class Duck extends FlyWithWings {} // ❌ (상속으로 전략을 결정)

왜냐면,

  • 이러면 오리가 무조건 날아야 함 (행동이 고정됨).
  • 중간에 날 수 없는 오리로 바꾸려면 상속 구조를 새로 짜야 함.

그래서 이렇게 합성으로 처리하지:

class Duck {
    private FlyBehavior flyBehavior; // ✅ "has-a" 관계 (합성)
}

👉 즉,

전략 패턴은

  • 행동(알고리즘)을 클래스로 만들어서,
  • 객체로 주입해 넣고,
  • 필요하면 set으로 교체까지 가능하게 해서

합성을 통한 동적 유연성을 주는 게 핵심이야!


✅ 정리

✅ 전략 패턴 핵심
✔️ 합성을 통해 행동을 주입한다
✔️ 동적으로 전략(행동)을 변경할 수 있다
✔️ 상속보다 더 유연하게 설계된다

사용 시기

  • 전략 알고리즘이 여러 버전이 있고 변형이 필요할때
  • 알고리즘 코드가 노출되면 안될때
  • 런타임 시간이 전략을 교체해야할때

주의점

  • 알고리즘이 많아지면 객체 수도 증가
  • 알고리즘이 간단하다면 패턴을 사용하는게 역효과
  • 적절한 선택을 위해 트레이드 오프를 구분
profile
멋있는 사람 - 일단 하자

0개의 댓글