티스토리 뷰

스트래티지 패턴(Strategy Parttern) - 디자인 패턴 01

디자인 패턴 중에서 스트래티지 패턴에 대해서 복습해 보도록하겠습니다. 교재는 Head First DesignPattern을 사용했습니다.

우선 스트래티지 패턴(Strategy Pattern)이란?

이 패턴에서는  알고리즘패밀리를 정의하고 각각을 캡슐화 해서 교환하면서 사용할 수 있게 만들어줍니다. 때문에 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있게 됩니다.

예시

 만약에 오리시뮬레이터라는 간단한 클래스가 있는데 여기서 오리는 나는행동과 꽥꽥우는 행동을 할 수 있다고 할 때, 여러개의 다양한 오리들을 생산해 낼 수 있는데 이때 Duck 클래스를 만들어서 각각의 새로만들어 지는 오리들은 이 Duck클래스를 상속해서 만들 수 있습니다. Duck클래스에서는 오리의 기본적인 행동인 나는것과 꽥꽥우는 것이 포함되어 있으니 각각의 오리를 만들어 줄 때 일일이 코드를 작성하지 않아도 됩니다. 이렇기 때문에 상속을 사용하게 되는 것이죠.

 그러나 오리가 우는 소리가 다르거나 장난감 모형오리는 날 수 없습니다. 또는 날개를 잃은 오리는 날지 못하겠죠. 등등의 사할 때문에 오리의 공통적인 특성으로 날 수 있는 것과, 울음소리를 꽥하고 되는 것은 추후에 업데이트시 문제가 될 수 있겠죠. 그래서 생각해 낸 것이 또 오버라이딩을 통해서 오리객체를 생성할 때 모형오리는 부모클래스인 Duck클래스의 날 수 있는 매서드를 오버라이딩하여 못날 도록 설정합니다. 이렇게 하면 해결이 됩니다.

 하지만 치명적인 문제가 바로 재사용성에 대한 것입니다. 그리고 짖는것과 나는 것이 다른 오리들을 만들 때는 일일이 다 코드를 오버라이드 해주어야하며, 새롭게 변경할 때도 다 찾아서 코드를 직접 변경해야 한다는 것이 문제가 되죠.

 이 때 사용해 볼 수 있는 디자인 패턴이 바로 스트래티지 패턴입니다.

스트래티지 디자인

 오리시뮬레이터는 위와 같은 클래스와 인터페이스 파일로 이루어져 있습니다.

클래스다이어그램

 클래스 다이어 그램은 위 처럼 구성이 되어있고, FlyBehavior, QuackBehavior는 인터페이스입니다. Duck클래스는 추상클래스인데 멤버로 이 인터페이스를 갖게 되면서 각각 상속받는 물오리와 장난감모델 오리에서, 물오리는 날 수 있으며 꽥 소리를 내는 설정, 장난감모형은 날지못하며, 조용하다는 설정을 생성자를 통해서 설정하게 합니다.

 그러면 오리 객체를 생성할 때 마다 코드를 작성하지않아도 되니(인터페이스로 미리 구현해 놓았으니) 그냥 상속을 받아 오버라이딩하는 것 보다는 엄청 유연한 코드가 된 것이죠.

 또, 수정을 해야할 경우라면 어떨까요? 또는 실행중에 동적으로 행동을 할당해 주고 싶을 경우에는 Duck에 set매서드를 추가하여 행동변경이 가능합니다. 만약에 위의 경우에서는 장난감모형 오리는 사실 날 수 없지만, FlyRocketPowered (로켓추진장치) 를 이용해서 날 수 있게 동적으로 변경이 가능합니다. 이때, set매서드에 FlyRocketPowered 객체를 매개변수로 입력해 주면 됩니다.

 어플리케이션의 경우에 개발이 되기 전보다는 개발이 되고 난 후에 코드에 시간을 더 많이 쏟게 되는 것이 대부분이므로 관리의 용이성과 확장성보다는 재사용성에 더 많은 노력이 필요한 것을 알게되었습니다.

캡슐화된 모습


 또, 각각의 나는행동과, 꽥꽥우는 행동을 일련의 알고리즘군(family of algorithms)으로 생각해 보면, 회사마다 달라지는 월급 계산 방식 등을 구현하는 클래스에서도 사용할 수 있을 것입니다. 이러한 것은 디자인원칙인 상속보다는 구성을 활용한다는 원칙을 반영한 결과죠. 앞으로도 자주 사용하게 될 것 같은 디자인 패턴이니 머릿속에 저장해 두도록 하겠습니다.

DesignPattern_Duck_02ver.zip

C# Linq (from in select 구문, orderby, 매서드에서 사용)

[java] import 키워드 (외부 패키지 클래스 사용하는법)

한국영화 기억의밤 다시보기 (한국판 겟아웃?)

댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함