알라딘MGG와이드바


게임 프로그래밍 패턴 Part 2 - 디자인 패턴 다시 보기 보충자료 개발 이야기

Part 2 - 디자인 패턴 다시 보기

명령 패턴(Command)
『GoF의 디자인 패턴』 인용문은 『GoF의 디자인 패턴』(피어슨에듀케이션코리아, 2015)을 그대로 발췌하며 쪽수도 번역판의 쪽수다.
-> Part 1 보충자료에서 얘기했었지만 2015년 판은 '피어슨에듀케이션코리아'가 아니라 '프로텍미디어'에서 나왔다. 2007년 판은 절판된지라 2015년 판이라고 써 놨지만 『GoF의 디자인 패턴』(피어슨에듀케이션코리아, 2007)을 기준으로 페이지를 적은 거라 2015년 판과는 다를지도 모른다.


-> 한 줄 요약:클래스에서 내부 상태만 따로 뽑아내 단계별로 저장한다.
'Java 언어로 배우는 디자인 패턴 입문' 18장에도 Memento 패턴이 소개되어 있다.

참고로 '게임 프로그래밍 패턴'을 번역하면서 패턴 이름을 영어 그대로 쓸지 한국어로 바꿀지 고민했다. 결과적으로 Observer나 Flyweight는 관찰자, 경량으로 번역하고, Singleton, Prototype은 싱글톤, 프로토타입으로 번역했다. 한국어와 영어음차를 혼용해 놓은 셈이다. 실무에서는 패턴을 영어 그대로 부르는 경우가 많음에도 일부 패턴 이름을 한국어로 번역한 이유는 문장을 쉽게 읽을 수 있게 하기 위해서였다. 다음 문장을 보자.

캐릭터를 관찰하던 UI창은 알림을 받아 체력바를 갱신한다.(The UI screen observes that and updates the little health bar.)

여기에서 observe는 동사로 사용된다. 영어는 참 편하다. 같은 단어를 패턴 이름으로도 쓰고, 코드에서 클래스나 메서드에도 쓰고, 명사, 동사, 심지어 부사로도 사용한다. '옵저버' 패턴이라고 번역했더라면 패턴 이름이 동사로 사용되었다는 걸 알기 어려웠을 것이다. 이 문장에서 '관찰'을 굵은 글씨체로 써 놨더라면 더 좋았을텐데 내가 마지막에 지쳐서 그렇게까지는 하지 못했다.

경량 패턴(Flyweight)


관찰자 패턴(Observer)

원서에서는 그림 4-1을 '의도치 않은 중의적 표현'(Unintended double meaning)이라고 설명한다.(웹 버전은 'I swear I had no double meaning in mind when I drew this.'이다. 참고로 책과 웹버전이 서로 다른 경우에는 저자의 의도를 좀더 잘 보여주는 웹 버전을 기준으로 번역했다.) '업적:족제비 무사'(Achievement:Weasel Wielder)가 왜 중의적이라는 걸까? 뜬금없이 '죽은 족제비'(Dead Weasel)는 왜 나오는 걸까?
저자에게 물어보니 족제비(Weasel)가 '자위'를 연상하기 때문이라고 한다. 실제로 Urban Dictionary에서 'whacking the weasel'를 검색해 보면 자위(masterbating)라는 의미가 있다.
기술서에 '자위'라니... 저자와 논의 끝에 번역서에서는 '의도치 않은 중의적 표현'을 제거하기로 했다. 참고로 'whacking the weasel'를 Youtube에서 찾아보면 두더지 잡기 게임을 하는 영상이 나온다. 우리는 두더지라고 생각하는 데 저쪽은 족제비라고 생각하나 보다.


주석 17. 따지려 드는 건 아니지만 『GoF의 디자인 패턴』에서는 이 문제를 전혀 다루지 않는다.
->『GoF의 디자인 패턴』(피어슨에듀케이션코리아, 2007) p.387에서 포인터 무효(dangling)에 대한 문제를 다음과 같이 언급하고 있다.
'삭제한 주체에 대한 무효(dangling) 참조자를 계속 유지할 때가 있습니다.' 주체의 삭제로 감시자가 무효 참조자를 갖게 되도록 만들면 안 됩니다. 이 무효 참조자를 피하는 한 가지 방법은 주체가 감시자에게 '자신이 삭제되었으니 감시자에 대한 참조자를 없애라'고 통보하는 것입니다. 다른 객체들이 감시자를 참조할 수 있고, 또 감시자글이 다른 주체를 관찰해야 하기 때문에, 이런 감시자의 삭제는 있을 수 있는 일입니다.
-> '전혀 다루지 않았다'는 평가는 좀 가혹하다는 걸 알 수 있다.


같은 해에 에이스 오브 베이스 같은 밴드가 싱글을 세 장이나 히트시켰다는 걸 보면 당시 우리의 수준이 어땠는지 대략 짐작할 수 있다.
-> 저자에게 물어보니 1994년 미국에서 에이스 오브 밴드가 히트시킨 싱글은 "The Sign", "Don't Turn Around", "All That She Wants" 이었다고 한다. 다 귀에 익은 노래다(아재 인증. T_T). 참고로 저자가 나와 나이가 비슷해서인지 국가가 다름에도 불구하고 공감대를 종종 찾아볼 수 있었다.
-> 참고로 한국의 1994년을 찾아보면 더 우울하다. 김일성 주석이 죽었고(진심으로 전쟁 나는 줄 알았다), 퇴마록이 나왔으며, 사랑을 그대 품안에가 방송되었다. Windows NT 3.5가 출시되었고, 넥슨이 설립되었다. 김영삼 정부는 1993년부터다. 다행히 노태우 시절은 아니구나.

'함수형 반응적 프로그래밍'에 대해서는 김종욱씨가 NDC14에서 발표한 'Rx와 Functional Reactive Programming으로 고성능 서버 만들기'를 참고해보자.

프로토타입 패턴(Prototype)


루리웹에서는 <건틀릿(Gauntlet)>을 '세계 최초의 4인용 게임'이라고 한다. (나는 아직 못 해 봤다.)
2014년에 리메이크 되었다. 스팀에서 구매할 수 있다.

'행사코드'라는 표현은 『폴리글랏 프로그래밍』(한빛미디어, 2014)에서 임백준님이 'Ceremony Code'를 번역한 표현이다. '게임 프로그래밍 패턴'에서는 boilerplate code나 ceremonial verbiage 등을 행사코드로 옮겼다. 프로그래밍 트랜드를 이해할 수 있는 좋은 책이라 재미있게 읽었다.

주석 5. C++ 개발자들이 템플릿을 예전보다 잘 쓰는 이유에 대한 개인적인 생각은 다음과 같다.
  • 컴파일러 개선 - 예전에는 템플릿 코드에 중단점(BreakPoint) 하나 잘못 걸면 IDE가 행에 걸려서 아무 것도 못하곤 했는데 요즘은 그런 걸 거의 느끼지 못한다.
  • STL의 보급. 템플릿 코드를 만드는 게 아니라 사용하는 경험부터 하다보니 좀더 빨리 익숙해 지는 게 아닐까...
  • C++11/14 - 이제는 템플릿을 피할 수 없다.

저자가 만든 스크립트 언어 Finch 홈페이지


스티브 예이그(Steve Yegge)가 쓴 '범용 디자인 패턴(Universal Design Pattern)'

데이터 모델링을 위한 프로토타입 : JSON 데이터
-> 실무였다면 고블린 JSON 데이터에 한글을 써 넣진 않았을 것이다. 대신 지역화 데이터를 따로 두었을 것이다.

싱글턴 패턴(Singleton)

저자는 싱글턴에 대한 적개심을 숨기지 않는다. 굉장히 여러 곳에서 싱글턴을 쓰지 말라고 얘기하고 있다. 나는 의미적으로 싱글턴에 어울리는 클래스라면 싱글턴을 쓰지 않을 이유가 없다고 생각한다. 그래도 저자가 제시하는 싱글턴의 대안은 참고할 만 하다.

static 변수와 스레드 안전성에 대해서는 다음 글을 참고하자.

GCC 같은 경우 내부적으로 초기화 함수가 호출될 때 동기화를 수행한다. __cxa_guard_acquire, __cxa_guard_release라는 자체 함수를 이용하여 정적 지역 변수 초기화 부분을 동기화하는데, 해당 함수의 소스를 살펴본 결과 PThread의 동기화 함수인 pthread_mutex_lock, pthread_mutex_unlock이 사용되고 있음을 확인할 수 있었다.
C++ 를 깊게 파고들고 싶다면 읽어볼 만한 좋은 책이다.


정적 변수 초기화 순서를 걱정하지 않고 정적 변수로 싱글턴을 만드는 방법으로 유명한 Meyer's singleton이 있다.

상속 등을 이용해 테스트용 모의 객체(mock object)를 만드는 기법은 '레거시 코드 활용 전략'(에이콘출판사, 2008)에서 찾아볼 수 있다.

메모이제이션(memoization) 최적화 기법은 동적 알고리즘, 동적 계획법에서 사용된다. 중간 계산값을 저장해 둠으로서 속도를 향상시키는 방식이다. 피보나치 계산이나 이항 계수 계산에서 어떻게 사용되는지를 보면 바로 이해할 수 있다.

상태 패턴(State)

FSM 코드를 자동으로 생성해주는 SMC - The State Machine Compiler 라는 게 있다. 예전에 NPC AI 코드를 만들 때 도움을 많이 받았다.

튜링머신에 대해서는 '컴퓨터과학이 여는 세계'(인사이트, 2015)가 설명을 참 잘 해 놨다. 좋은 책이다.

조크(Zork) - 옛날 텍스트 MUD 게임. 여기에서 해 볼 수 있다.

스몰토크.
ifTrue: ifFalse:
원래 원서에서는 ifThen:이라고 되어 있었다. 다행히 스몰토크 전문가인 승범님에게 도움을 요청해 정정할 수 있었다.(승범님 감사합니다.)
참고로 스몰토크에서 클래스는 모두 대문자로 시작하고, 객체는 소문자로 시작한다고 한다. 즉, True, False는 클래스 이름이고 true, false는 객체 이름이다. true, false는 몇 안되는 예약어이라고 한다.(예약어는 true, false, nil, self, super, thisContext 6개만 있다.)

이미지에서 볼 수 있듯이 True의 ifFalse 구현 부분을 보면 그냥 ^nil 로 되어 있다. ^는 리턴을 의미한다. 스크린샷은 squeak에서 빠져나와서 유럽쪽에서 다시 개발되는 버전인 Pharo이다.
해당 화면을 보려면 Workspace을 열고 True라고 입력한 뒤 단축키 b를 누른다.
스몰토크 초기 역사에 대해서는 최승준님의 이 글도 참고하자.

행동 트리(behavior tree)에 대해서는 김용하님의 'NDC 2009 - 행동 트리로 구현하는 인공지능' 발표자료를 참고하자.

덧글

댓글 입력 영역


Yes24위대한게임의탄생3

위대한 게임의 탄생 3
예스24 | 애드온2