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

류재성's avatar
May 27, 2024
[디자인 패턴] 1 전략 패턴(Strategy Pattern)
 

1. 객체 지향의 원칙 중 3가지

 

1.1 SRP (단일 책임 단일 원칙, Single Responsibility Principle)

notion image
💡
클래스가 하나의 기능만을 수행하고, 그 기능에 대한 모든 것을 해당 클래스가 책임진다. SRP를 사용하면 코드의 응집도가 높아지고, 결합도가 낮아지며, 유지보수와 확장이 쉬워진다.
 

1.2 OCP (개방-폐쇄 원칙, Open-Closed Principle)

 
notion image
notion image
 
토끼를 고양이로 수정하는 대신 죄인이라는 추상 클래스를 만들어 추상 클래스에 매개변수로 값을 넣는다.
 
💡
소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다는 원칙이다. 즉, 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있어야 한다.
 

1.3 DIP (의존성 역전 원칙, Dependency Inversion Principle)

notion image
💡
고수준 모듈이 저수준 모듈에 의존하는 전통적인 의존 관계를 역전시켜, 두 모듈 모두 추상화에 의존하도록 만드는 원칙이다. 고수준 모듈은 로직을 포함하는 모듈로, 시스템의 주요 기능을 구현하며, 저수준 모듈은 세부적인 기능을 제공하는 모듈로, 고수준 모듈에 의해 사용된다. 즉 DIP 는 구체화된 자식 클래스에 의존하지 않고, 추상화된 부모 클래스이 의존해 코드의 유연성을 높이는 것이다.
 

2. 전략 패턴(Strategy Pattern)

 
💡
전략 패턴(Strategy Pattern)은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 특정 행동을 수행하는 알고리즘들을 각각 캡슐화하여 필요할 때마다 서로 교체할 수 있도록 하는 패턴이다. 이 패턴을 사용하면 클라이언트 코드에서 알고리즘을 변경하지 않고도 다양한 알고리즘을 사용할 수 있다. 전략 패턴은 행동(Behavioral) 패턴에 속함.
 
 
package ex01; //쥐 public class Mouse{ private String name = "쥐"; public String getName() { return name; } }
 
package ex01; //문지기 public class Doorman { public void 쫓아내(Mounse mouse){ System.out.println(mouse.getName()+ " 을 쫓아내"); } }
 
package ex01; public class App { public static void main(String[] args) { Mouse mouse = new Mouse(); Doorman doorman = new Doorman(); doorman.쫓아내(mouse); } }
 
문지기는 쥐를 쫓아낸다.
 
💡
만약 문지기가 쥐 뿐만 아니라 호랑이도 쫓아내야 한다면?
 
package ex01; //쥐 public class Tiger extends Animal { private String name = "호랑이"; public String getName() { return name; } }
 
 
package ex01; //문지기 public class Doorman { public void 쫓아내(Mouse mouse,Tiger tiger){ if(mouse!=null){ System.out.println(mouse.getName()+ " 을 쫓아내"); }else { System.out.println(tiger.getName()+ " 을 쫓아내"); } } }
 
문지기는 새로운 매개변수를 추가해야 한다. 이때문에 전략 패턴을 사용한다.
 
동물이라는 추상 클래스를 만든다.
 
package ex01; public abstract class Animal { public abstract String getName(); }
 
package ex01; //문지기 public class Doorman { public void 쫓아내(Animal animal){ System.out.println(animal.getName()+ " 을 쫓아내"); } }
 
도어맨은 매개변수로 animal 을 받으면 된다.
 
package ex01; public class App { public static void main(String[] args) { Animal mouse = new Mouse(); Animal tiger = new Tiger(); Doorman doorman = new Doorman(); doorman.쫓아내(mouse); doorman.쫓아내(tiger); } }
 
Share article

{CODE-RYU};