이 포스트를 만든 목적

  • Command 패턴을 이해 하는 것이다.

이 포스트의 준비물

  • Firefox 3.6.10
  • Winamp v.5.572 (x86)
  • gVim 7.3
  • gcc 4.5.0

참고 서적

  • 안드레 알렉산드레스쿠 저. Modern C++ Design. 이기형 역.
    Addiston-Wesley. 인포북. 초판 2003.07.30. page(177 ~ 180)

  • Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Gof의 디자인 패턴. 김정아 역.
    Addison-Wesley. 3쇄 2002.12.20. page(278 ~ 289)

  • 장세찬 저. 디자인 패턴! 이렇게 활용한다.
    한빛 미디어. 3쇄 2006.07.18. page(303 ~ 332)

내용

C++에서 Command 패턴이란 무엇인가?

  • C++ 에서 호출 가능한 객체의 요청을 동일하게 캡슐화하기 위한 패턴이다.
    - 책에 나온 내용을 그대로 적은건데, 이상하게 어렵다.

  • 메세지와 이 메세지를 처리하는 객체를 쉽게 연결시키기 위한 패턴중 하나이다.

좀 풀어서 써야겠다. 인도영화 "못말리는 세친구 - 3idiots" 를 보면, 극 중 인물 란초가 "책"에 대해서 형이상적 언어로 표현하는 부분이 있는데, 간단하고 쉽게 쓰는게 제일 좋다는 것을 보았기 때문이다. 예를 들면 Command 패턴을 이렇게 표현할 수 있다.

  1. 내가 삼성동 수제비 식당에 들어갔다.
  2. 종업원이 무엇을 시킬지 물어 본다.
  3. 나는 바싹 익힌 자반 고등어, 임선임님은 매콤 달콤한 오징어 볶음, 강책임님은 짭짤한 황태구이를 주문한다.

  4. 종업원은 몇번 식탁에서, 어떤 주문을 받았는지 주문서에 적는다.
  5. 종업원은 주문서를 주방에가서 주방장에게 보여준다.

  6. 주방장은 주문서에 나와 있는 데로, 요리릴 시작한다.
  7. 주방장은 요리가 끝나자, 주문서를 보고, 몇번 테이블 무슨 음식 다 됬다고, 종업원에게 알려준다.

  8. 종업원은 주문서를 보고, 요리와 맞는지 확인하고, 주문한 식탁에 전달한다.

  9. 이것으로 모든 주문은 정상처리되어, 식당을 찾은 우리들은 점심을 맛나게 먹었다.

1 ~ 8 번의 과정은 Command 패턴을 몹시 잘 사용한 형태이다. 다음을 보자:

  • 자반 고등어, 오징어 볶음, 황태구이가 실제로 만들어야 하는 일이다.
    - 이것은 호출해야 하는 객체(음식들)을 주방장으로 부터 분리시킨 행위이다. 이렇게 한 이유는 종업원이 이 음식들을 만들수 없기 때문이다.
    : Command 패턴의 한 부분인 호출 가능한 객체(음식)의 요청을 캡슐화한 것을 만족한다.

  • 주문서에 적힌 내용을 실제로 일을 처리하는 주방장에게 전달했다.
    - 주방장은 이 주문서를 보고, 자반 고등어를 만들라고 주방장 보조에게 시키고, 다른 요리들도 역시 각 주방장 보조에게 전달 할 것이다.(혹은 혼자 다 만들 수도 있다.) 이것은 요청이 전달 되었다는 것을 뜻한다

  • 주방장은 "바싹 익힌", "매콤 달콤한", "짭짤한" 등을 보고, 거기에 맞게 조리를 한다.
    - 이 의미는 자반 고등어 등의 주문마다 특정한 상태를 저장한 것이다.
    : Command 패턴인 호출 가능한 객체(음식)의 요청을 잘 캡슐화 하였다는 뜻이다.

  • 주방장에 의해 음식이 다 되었으면, 종업원은 주문서에 적힌 식탁으로 돌아가 음식을 건네준다.
    - 이 의미는 단순히 황태 구이를 시킨다 하더라도, 황태 구이 마다 특정한 출처를 기록할 수 있다는 것을 의미한다.
    : Command 패턴인 호출 가능한 객체(음식)의 요청을 매우 잘 캡슐화 하였다는 뜻이다.

실제로 이 패턴이 유용해지는 상황은 어디인가?

  • 오늘 오전 10시에 삼성동 수제비 식당에 전화해, 오늘 오후 7시에 자반고등어를 요청 할때,
    - 이런거 모르니까, 7시에 다시 전화해 라고 응대한다면, 망할 것이다. 그래서, 명령을 객체화 하여 저장해 두었다가 필요할 때, 수행하기 위해 Command 패턴을 사용하면, 무척 유용하게 사용할 수 있다.
    : 요청한 시간과 처리될 시간이 다를 때

  • 오늘 무슨 음식을 만들었었는지 기록할 때,
    - 주방장에게 오늘 무슨 음식 기록했냐고 물어보면, 정신없어(어디서 체크 해야 하는지) 잘 모르기 때문에, 명령을 객체화 하여 기록하면 무척 유용하게 사용할 수 있다.
    : 자기가 한일을 기록할 때

  • 반드시 자반 고등어 다음에 황태구이를 요구하는 고객이 있을 경우,
    - 이런거 안되니까, 안해줄꺼야 라고 응대한다면, 망할 것이다. 그래서, 주문서 하나를 순서대로만 처리하기 쉽기 때문에. 무척 유용하게 사용할 수 있다.
    : 트랜잭션이 필요할 때

  • 고객이 환불을 요구할 경우
    - 이런거 안되니까, 안해줄꺼야 라고 응대하면, 영업 정지 당할 것이다. 그래서, 주문서를 보고, 손쉽게 환불 할 수 있다.
    : Undo, Redo 기능이 필요할 때

여담

  • 참고 서적을 형식에 맞추어 적어 봤다.
  • 호출가능한 객체들을 저장하는 방법으로 함수자(함수 객체)를 사용하는게 편하다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기