knowledge2008/07/23 15:19

안녕하세요. 이번 시간에는 조금은 가벼운(?) 이야기를 해볼 가 합니다. 많은 분들이 디자인 패턴에 대해 들어 보셨을 것입니다. 그 중에서 이번 시간에는 Observer Pattern에 대해 이야기를 해보려고 하는데요, Observer Pattern과 제가 좋아하는 게임인 StarCraft 에 대해서 이야기 해보겠습니다. 전혀 쌩뚱 맞은 조합이라 뭔 소리를 하고자 하는지 궁금하시죠? 특별한 내용은 없고 단지 좀 더 쉽게 Observer Pattern 에 대해서 설명하고자 하는 내용이니 부담 없이 읽어주셨으면 합니다.

StarCraft를 처음 알게 된 게 제가 초등학교 5학년 때 정도니까 지금으로부터 거의 10년 가까이 옛날 일이네요. 그때 까지만 제가 이런 일을 할 것 이라곤 상상도 하지 못했었는데.. ㅎ 10년이나 지난 예전 일을 회상 한다는 게 가능한 나이라니 ㅜ 저도 이제 어른이 되어가고 있나 봅니다 ㅠ_ㅠ

요즘에 StarCraft를 즐겨 하고 있는데(절 때 잘 하는 이 아닙니다용 ㅠ), 한 수 가르쳐 주실 분 모시고 있습니다용 ㅎㅎ

Observer Pattern을 이야기 할거라 Observer 사진을 준비해봤습니다 -_-ㅋ
포스팅을 위해 그림을 찾아봤는데 게임에서 볼 때 와는 상당히 다른 모습이네요 ㅎㅎ

제가 StarCraft의 개발자가 아니기 때문에 실제로 어떻게 구현이 되어있다고 말은 하기 어렵지만 우리가 즐기고 있는 StarCraft를 보며 Observer Pattern를 설명할 수는 있습니다. 예를 들어 Zealot 에게 9시로 이동해! 라고 한다면 이동 경로뿐 만 아니라 주변 상황까지 상세하게 알 수 있죠, 우리가 Zealot에게 지금 상황은 어떠니 지금 어디니 감시를 하고 있지 않아도 알 수 있다는 겁니다. 그 이유는 아군 Unit은 무언가 자신에 대한 상황이 비꼈을 경우 대장(게임 플레이어 이겠죠?)에게 보고를 해야 하는 "규칙"이 있기 때문입니다. 반대로 해당 Unit이 가만히 멍 때리고 앉아 있을 때는 보고하지 않아도 된다는 말이죠.

이게 바로 Observer Pattern인데요, 객체가 무엇을 하고 있는지 전혀 관여를 하지는 않지만, 전체적인 상황에 영향을 끼칠 만한 상황이 발생했을 경우에 스스로 알려주는 것이지요. 만약에 Zealot이 9시로 정찰을 갔는데 아무것도 없었다. 본부에 여기 아무것도 없어요~ 하고 말 한 다음 Zealot은 그 자리에 자유롭게 행동을 합니다. 본부에 서는 Zealot을 100% 신뢰하기 때문에 진짜야? 진짜 아무것도 없어? 라고 물어보진 않습니다. 만약에 Zealot이 배신을 했다! 하더라도 본부에서는 그가 배신을 했는지 안 했는지는 알 수가 없습니다. 불쌍하죠.. ㅎ

Observer Pattern에서는 굳이 객체를 감시하고 있지 않아도 변경에 대한 정보를 얻을 수 있기 때문에 시스템을 좀더 효율적으로 사용할 수 있습니다. 하지만 좀 전에 말했듯이 배신은 곧 파멸로 이어질 수 있습니다. 때문에 Observer Pattern에서의 Notify는 보장할 수 있는 조건 하에서만 이루어져야 한다는 사실을 알 수 있습니다.

Observer Pattern이 무엇인지 조금 이해가 가셨나요? 이런 Observer Pattern은 UI개발에 꽤나 효율적인 방법으로 이용 될 수 있습니다.

Archon이라는 객체가 있다고 합시다. 그리고 위치, 체력, 킬, 기술, 업그레이드 등의 속성을 가지고 있습니다. 아래 그림과 같이 화면 중앙엔 현재 사용자가 보고 있는 화면이 표시되고 왼쪽 하단엔 미니 맵, 중앙 하단에는 선택한 Unit의 정보, 오른쪽 하단에는 Unit의 능력에 대한 내용이 표시 된다고 합시다.

그렇다면 여러분이라면 어떻게 구현 하시겠습니까? Observer Pattern을 사용하지 않는 다면, 매 순간마다 게임에 등장하는 모든 객체들에게 "너 지금 어디에 있니, 그리고 체력은 몇이나 있니 몇 명이나 죽였니…" 라고 물어보고 화면에 그려야 하는지 여부를 판단 할 것입니다. 하지만, Observer Pattern을 사용한다면 일일이 객체들에게 간섭하지 않아도 알아서 "나 지금 여기에 있어요, 나 지금 선택 됐어요, 체력은 얼마에요"라고 미리 말을 해주니 객체들이 하는 말에만 귀 기울여 화면에 그린다면 불필요한 간섭을 피하고 간단하게 구현 할 수가 있습니다.

글을 쓰다 보니 Observer Pattern 마치 킹왕짱 인 것처럼 쓴 것 같습니다만, Observer Pattern은 하나의 객체를 가지고 여러 가지 형태로 표현하기 위한 효율적인 하나의 방법으로 모든 상황에서 Observer Pattern을 사용해 대처하기엔 그 한계가 있습니다. 이 글은 단지 Observer Pattern에 보다 쉽게 이해할 수 있도록 돕기 위해 작성된 글이며, 실제 구현상에 맞지 않는 부분이 생길 수 도 있습니다.

Design Pattern은 Observer뿐만 아니라 다양한 패턴이 존재하며 현재도 많이 발표가 되고 있으니, 자신의 상황에 맞는 적절한 패턴을 사용 하시는 것을 추천합니다.

사용자 삽입 이미지

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스