-
Strategy Pattern디자인 패턴 2022. 2. 2. 16:14
디자인 패턴, 항상 공부한다고 했다가 손을 놓은 이름이다. 변명을 대자면 인터넷에서 위키피디아를 뒤져가며 공부하기엔 나에겐 너무나도 지루했고 어려웠기에 안했었다. 그래도 워낙에 중요하다고 하니 이번에 유명한 책을 샀다. 파이썬 공부할 때 신세를 졌던 그 이름 ‘헤드 퍼스트’의 책이다.
역시 헤드퍼스트 시리즈라고 해야할까 1장까지 읽은 지금까지의 소감을 말하자면 ‘재미있음!’이다. 첫 장의 내용이 Strategy 패턴인걸 안알려주고 설명을 해주는데 마지막에 이게 Strategy 패턴이라고 알려줘서 정말로 깜짝 놀랐다.
이 기억과 느낌을 까먹기 전에 오늘 배운 내용을 정리해보자.
Strategy Pattern
패턴을 배우기 위해서 간단하게 ‘오리 시뮬레이터’를 생각해보자. 이 오리 시뮬레이터에는 청둥오리도있고 욕실용 가정 오리도 있다. 각각은 구체 클래스로 정의되어 있다고 해보자. 그리고 각각에는 꽥꽥거리는 기능인 quack()기능이 구현되어 있다.
// 청둥오리 구체 클래스 public class MallardDuck { public void quack() { System.out.println("꽥꽥"); } }
만약 이 상태에서 ‘오리가 나는 기능’을 추가해야한다! 라는 요구사항이 들어왔다고 가정하면 어떻게 해야할까? Duck이라는 클래스를 만들고 상속을 이용해서 구현하면 편하지 않을까 싶다.
// 오리 public class Duck { public void quack() { System.out.println("꽥꽥"); } public void fly() { System.out.println("나 지금 날고있어요!"); } }
// 청둥오리 구체 클래스 public class MallardDuck extends Duck { }
하지만 여기엔 문제가 있으니 클래스에는 MallardDuck뿐만 아니라 RubberDuck도 있다는 사실이다. RubberDuck은 날지 못하는데 어떻게 처리를 해야할까? 오버라이드를 통해서 코드를 구현하기엔 다른 오리들도 많이 있으므로 너무나도 많은 노동력이 필요하게 될 것이다.
이 문제를 해결하기 위해서 두 가지의 디자인 원칙을 적용해보자.
- 애플리케이션에서 달라지는 부분을 찾아내고 달라지지 않는 부분으로부터 분리시킨다.
- 구현이 아닌 인터페이스 맞춰서 프로그래밍한다.
애플리케이션에서 달라지는 부분은 나는 ‘행동’과 꽥꽥거리는 ‘행동’으로 나눌 수 있다. 해당 부분들을 분리해보자.
Duck에서 FlyBehavior과 QuackBehavior를 분리해내고 기능들에 해당하는 내용을 클래스로 분리해두었다. 이런식으로 디자인함으로써 Duck 클래스를 전혀 손대지 않고 기능을 다음과 같이 추가 할 수 있다.
다음과 같이 상속을 해주는 Duck 클래스에서 인터페이스 변수들을 추가하는 방식으로 해당 행동들을 오리에 추가해줬다.
그러고나서 구체적인 구현을 하는 MallardDuck 클래스에서 구체적인 행동을 지정해주는 방식으로 구현되었다. 이런식으로 구현할 때의 장점은 굉장히 유연하다는 것에 있다. 만약에 삑삑거리는 물오리를 만들고 싶다면 Quack의 구현 클래스를 Squeak로 바꿔주기만 하면 된다.
위의 사진에서 Duck은 클라이언트단의 코드라고 볼 수 있고 FlyBehavior와 QuackBehavior는 자주 변경되는 부분을 캡슐화한 부분이다. 이처럼 알고리즘 군을 정의하고 캡슐화하여 교환해서 사용 할 수 있도록 하는 패턴을 ‘스트래티지 패턴’이라고 한다. 스트래티지 패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경 할 수 있게 된다. 이 패턴은 상속보다는 구성(Composite)을 사용한 것으로 이렇게 시스템을 만들면 유연성을 크게 향상시킬 수 있다.
정리
객체지향의 기초
- 추상화
- 캡슐화
- 다형성
- 상속
객체지향의 원칙
- 바뀌는 부분은 캡슐화한다.
- 상속보다는 구성(Composite)을 활용한다.
- 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
Strategy Pattern
알고리즘 군을 정의하고 각각을 캡슐화하여 바꿔 쓸 수 있게 만든다. 스트래티지 패턴을 이용하면 알고리즘을 활용하는 클라이언트와 독립적으로 알고리즘을 변경 할 수 있다.
'디자인 패턴' 카테고리의 다른 글
Decorator Pattern (0) 2022.02.08 Observer Pattern (0) 2022.02.03 싱글톤 패턴(Singleton Pattern) (0) 2021.10.28 Facade Pattern (0) 2021.10.27 디자인 패턴 개요 (0) 2021.01.06