[디자인패턴] 1. Strategy Pattern

문정준's avatar
Jul 21, 2025
[디자인패턴] 1. Strategy Pattern

Strategy Pattern

  • 각 객체가 할 수 있는 행위에 대한 클래스 생성
  • 클래스들을 포괄하는 인터페이스 (추상 클래스) 생성
  • 전략만 수정해줌으로써 행위를 유연하게 확장할 수 있음
 

성을 지키는 문지기 vs 동물

  • 문지기 : 동물들을 쫓아내는 행위(책임)
public class Doorman { public void getOut() {} }
  • 동물 : 쥐, 호랑이, 고양이
public class Mouse { private String name = "쥐"; public String getName {return name;} } public class Tiger { private String name = "호랑이"; public String getName {return name;} } public class Cat { private String name = "고양이"; public String getName {return name;} }
 

Q1. 문지기가 쥐를 쫓아내려면?

  • 쫓아내는 메서드의 대상에 를 추가
public class Doorman { public void getOut(Mouse m) { System.out.println(m.getName() + " 나가!"); } } public class App { public static void main(String[] args) { Mouse m1 = new Mouse(); Doorman d1 = new Doorman(); d1.쫓아내(m1); } }
 

Q2. 문지기가 호랑이도 쫓아내려면?

  • 문지기는 현재 쥐만 쫓아낼 수 있음 : 두 가지 방법이 존재
    • 메서드 오버로딩 : 메서드에 책임(호랑이)을 추가 (매개변수만 바꾸어 추가로 사용 가능)
      • 추가할 책임의 수량이 한정적일 때만 사용 가능, 추적이 어려움
      public class Doorman { public void getOut(Mouse m) { System.out.println(m.getName() + " 나가!"); } public void getOut(Tiger t) { System.out.println(t.getName() + " 나가!"); } // ... 개수가 많아지면 계속 추가해야 함 (추적이 어려움) }
    • 추상 메서드를 의존 : 전략 패턴
      • 책임이 추상 메서드를 상속받기만 하면 코드를 더 수정할 필요가 없음 : DIP 원칙
    • 추상 메서드로 만드는 이유 : 부모의 메서드는 재정의로 인해 무효화, 즉 구현할 필요가 없음
    • abstract class Animal { abstract String getName(); } public class Doorman { public void getOut(Animal animal) { System.out.println(animal.getName() + " 나가!"); } }
 

A : 코드 자체는 똑같으나, 전략 패턴을 사용하면 관리가 훨씬 유용해짐.

public class App { public static void main(String[] args) { Mouse m1 = new Mouse(); Doorman d1 = new Doorman(); d1.쫓아내(m1); Tiger t1 = new Tiger(); d1.쫓아내(t1); } }
 

Q3. 문지기가 고양이도 쫓아내려면?

  • 전략 패턴을 사용하면, 문지기는 할 것이 없음 (코드 수정 X)
  • 고양이가 동물을 상속받기만 하면 됨
  • OCP 원칙 충족
public class Cat extends Animal { private String name = "고양이"; public String getName() {return name;} // 상태 확인 (변경 X) } public class App { public static void main(String[] args) { Mouse m1 = new Mouse(); Doorman d1 = new Doorman(); d1.쫓아내(m1); Tiger t1 = new Tiger(); d1.쫓아내(t1); Cat c1 = new Cat(); d1.쫓아내(c1); } }
 

Strategy Pattern의 장점

  • SOLID 원칙의 O(OCP), D(DIP)가 충족됨
    • OCP (Open-Closed Principle) = 수정할 코드만 수정하고, 기존 코드는 건드리지 않음
    • DIP (Dependency Inversion Principle) = 추상적인 개념에 의존함
  • Doorman이 getOut의 책임만 가질 경우, SRP도 충족 가능
    • SRP (Single Responblility Principle) = 하나의 객체는 하나의 책임만 가져야 함
 
notion image
Share article

sxias