<패턴 정리를 시작하며...>
실무에서 일을 하다보면 바쁜 일정에 쫓겨 초기 설계를 게을리 할때가 많습니다. 쏟아지는 요구사항에 집중하다보면 코드
의 재사용성은 아무래도 뒷전으로 미루고 그야말로 엉키고 설킨 코드에 나중에는 돌이킬 수 없을 정도로 복잡한 프로그램이
되는 적이 종종 있었습니다. 하지만 역시나 가장 큰 이유는 제 스스로 바쁜 일정을 핑계로 패턴 공부를 제대로 할 생각이
없었던 것은 아닐까 라는 생각도 드네요.
그동안을 반성하며 몇 주째 책을 읽으면서 정리를 해놔야 겠다는 생각에 이렇게 글을 쓰게 되었습니다.
Head First사의 'Design Patterns' 책으로 공부 하였으며 단편적으로 알고 있던 사실을 좀더 구체화 하는데 도움이 많이 되었습니다.
사실 알게 모르게 패턴을 쓰고 있었지만 제 스스로 그렇게 구현하는 것이 패턴인줄 모르고 있었던 부분도 있고요. 알고
쓰는것과 모르고 쓰는 것은 엄청난 차이가 있다는 것도 이 책을 읽으면서 알게 된 부분입니다.
프로그램을 처음으로 배울때 무수히 많이 들었던 OOP, 재사용, 상속, 오버라이드, 추상 메서드 이런 개념들을 단편적으로는
다 알고는 있지만 얼마나 효율 적으로 그것을 사용하느냐 하는 것은 그동안 우리와 똑같은 문제를 겪었던 선배
프로그래머 들이 이렇게 패턴이라는 이름으로 잘 정리 해놓았으니 우리는 그저 따라하다보면 깨달음을 얻을 수 있지
않을까요.
Strategy Pattern (스트레티지 패턴)
- 우리는 귀여운 동물들이 등장하는 게임을 만들 생각 입니다. 오리, 새, 말, 강아지 등등
class Animal }
public void Run()
public void Fly()
public void Swim()
public void Display() |
위와 같이 Animal Class를 상속받는 동물 클래스를 만드려다 보니 문제가 생겼습니다.
날지 못하는 오리가 Fly() 메서드를 쓸 수 있고 수영 못하는 새가 Swim() 메서드를 쓸 수 있게 된 것입니다.
이 문제를 어떻게 해결할 수 있을까요?
먼저 나는 행동, 수영하는 행동, 달리는 행동에 대하여 캡슐화 해보겠습니다.
먼저 Swim 행동에 대한 인터페이스 클래스를 만든 뒤 '수영을 잘하는' '수영을 그럭저럭 함' '수영을 못하는'
클래스에서 상속을 받고 수영에 대한 구현을 만듭니다.
interface iSwim
public class GoodSwim : iSwim
public class NormalSwim : iSwim
public class NoSwim : iSwim |
위와 같은 방법으로 Fly와 Run도 만들어 줍니다.
interface iRun
public class FastRun : iRun
public class NoRun : iRun |
interface iFly
public class FlyWithWings : iFly
public class NoFly : iFly |
그리고 처음에 만들었던 Animal 클래스를 수정해야 겠죠.
일단 추상 클래스로 다시 만들어 줍니다. 누군가가 Animal 클래스로 new 하는 것을 방지 하기 위함입니다.
그리고 모두가 공통적으로 쓰는 Display() 역시 추상 메서드로 만들어 줍니다.
그리고 가장 중요한 인터페이스로 만들었던 클래스들을 멤버 변수로 선언 해 준 뒤
DoRun, DoFly, DoSwim 에서 각각 호출 해 주는 메서드를 만들어 줍니다.
abstract class Animal
public Animal() }
public void DoRun()
public void DoFly()
public void DoSwim()
public abstract void Display(); |
이제 실제 동물 클래스 즉 구상 클래스를 만들 차례 입니다.
class Duck : Animal
public override void Display()
class Bird : Animal public override void Display()
class Horse : Animal
public override void Display()
class Dog : Animal
public override void Display() |
여기까지 만들어 주었다면 테스트를 해봐야 겠죠.
메인 클래스를 만들어 줍니다.
class Program
Animal duck = new Duck();
Animal horse = new Horse();
Animal bird = new Bird();
while (true) } |
출력이 어떻게 되었나 볼까요.
이렇게 동물 특징에 맛게 잘 출력이 되었습니다.
또 한가지 우리는 동적으로 그 동물의 상태값을 바꿔 줄수가 있습니다.
예를 들어 어떤 말이 훈련을 통해 수영을 하게 된다던가 하는 경우가 생길수도 있으니까요.
다시 Animal 클래스로 돌아가서 Set 함수를 만들어 주기만 하면 됩니다.
abstract class Animal
public Animal() }
public void SetFly(iFly _ifly) public void SetSwim(iSwim _iswim) public void SetRun(iRun _irun)
public void DoRun()
public void DoFly()
public void DoSwim()
public abstract void Display(); |
이와 같이 set 함수를 만들어 준뒤
Animal horse = new Horse(); iSwim swim = new GoodSwim(); horse.SetSwim(swim); |
메인에서 Horse 객체를 만들때 새로운 상태값을 동적으로 Set 할 수 있습니다.
이상으로 Strategy Pattern 이였습니다.
첨부파일 : StrategyPatterns.cs