세상에서 제일 재미있는 디자인 패턴
들어가기 전에 잠깐 우리들의 영원한 고전... Hello World를 살펴보자. (만약 당신이 코딩에 대한
경험이 없거나, Hello World가 무슨 의미인지 모른다면, 당장
읽는 것을 중지하기 바란다. 심한 경우, 당신의 우뇌부분에
상당한 손상이 가해질 수 있다. 또한 당신이 MMORPG가
뭐에 쓰는 것이 모른다면. 당장 읽는 것을 중지할 뿐만 아니라, 이
것을 읽으려 했던 사실조차 망각하기 바란다. 그 이유는... 당신은
분명히 재미없는 사람이 틀림없기 때문이다. 이 글은 재미를 추구하는 자에게만 허락된 내용이다.)
[Hello World]
"Hello
World"를 찍는 다양한 프로그램....
가장 빨리?
가장 단순(LOC)?
재사용성을 높인다면?
String을 찍는 프로그램으로 개발하고, String을 "Hello World"으로 입력?
"Hi, YourName."을 찍는 것으로 바뀌었다면?
이때 별도
File 입출력을 했다면?
편지의 앞 또는 마지막 서명 형식으로 찍는다면?
Hello World 사이에 공백을 넣어서, 한 페이지에 당신의 얼굴을
그린다면?
목적에 따라 재사용성을 미리 고민할 것인지, 복잡도를 높일 가치가 있는지가 달라진다.
수많은 Decision들. Goal을 알고, 이유Why를
알고, 최적의 솔루션을 찾고, 적임자를 찾고, 맞는 환경을 찾고,...
고객의 생각이 바뀌면 모든 것이 바뀐다!
...
흠... 뭔가
요구가 바뀌고, 환경이 바뀌면... 뭐... 체력으로 버팅기지...뭐...
이건 진리지, 진리...
음...글고, 디자인 패턴을 보기 전에 "객체"를 빠삭하게 알아야하는데... 객체 이전의 방법과 객체 지향적
방법을 간단히 살펴보자. 여기서부터 모든 것은 게임으로 통한다. 게임.ㅎㅎㅎ
[전통적 프로그래밍]
main()이 있고, initGame()이 있고, startGame()이 있고, endGame()이 있다.
initGame()에는 Player를 만들고, Monster를 만들고, BattleField를 만들고, 암튼 무지하게 만든다.
start()에는 초기 화면이 나온다. 마을일 수도 있고, 전투가 바로 시작될 수도 있다. 모든 시나리오가 이 안에 있으며, (KeyBoard, Mouse)이벤트에 따라 계속 움직이고... Player찍고
땅 찍으면, Player 상태에 따라 달릴 수도 있고 걸을 수도 있다.
Monster 찍으면 공격한다. Player의 공격과
Monster 상태를 보고, 다친 정도를 결정한다,...
죽으면 또는 다 죽이면 끝난다.
endGame()이 있다.
게임 본연의 기능 외에 CPU Clock, 메모리 최적화 등 비기능적인 문제들은 항상 따라다녔다. 뭐... 이런 것들은 항상... 기본이지.
[객체 모델링]
...Player찍고 땅 찍으면, Player는 자기 상태를 보고, 걸을 것인지 뛸 것인지 결정한다. Monster 찍으면 공격하고, Monster는 상대방 공격력과 자신의 상태를 보고 다친 정도 또는 죽을 것인지를 결정한다....
Passive user
data type에서 Active
user data type이 된 것이다. 객체들은 자기 상태에 따라 적절한 행위를 취한다. 즉, 로직이 객체안에 캡슐화되어있다.
객체지향 시대로 접어들면서 데이터와 로직이 캡슐화된
클래스의 등장과 함께, 다양한 관계 표현이 나타났다. 함수
수준의 위임이 클래스 수준의 위임(delegation)으로 확장되기 시작했으며, 상속, 포함, 의존(Dependency), 추상클래스(Abstract class), 인터페이스(interface) 등이 등장했고, 이에 따라 객체들간 다양한 형태의
상호작용 표현이 가능하였다. 실세계의 복잡도를 기능과 데이터로 해체하기 보다는 복잡도 자체를 객체 속에
담고 인터페이스를 통해 보다 유연한 상호작용을 할 수 있는 능동적(Active) 소프트웨어 개념이 언어
속에 스며든 것이다.
객체지향 프로그래밍에 대한 메모리 배치를 보면(실제 눈으로 보면... 안보인다.), 코드(Code)와 데이터 공간이 분리되어 별다른 변화가 없는 것처럼 보인다. 객체가 생성될 때마다 데이터 부분의 메모리 공간이 할당되지만 코드는 공유한다. 뭐가 달라진걸까? 객체 속에 static으로 선언되지 않은 일반 멤버함수라면, 자기 자신을 가리키는(this) 포인터가 첫번째 인자로 숨겨져있다. 이렇게 데이터와 코드를 분리했지만, 논리적으로 그들을 엮어 객체라는 개념을 메모리에 실현한 것이다. 이때부터 본격적인 표리부동과 꼼수의 역사가 시작되었고, 객체 모델링이라는 매우 강력한 파워를 얻은 대신 패러다임의 혼란이 시작되면서 1980년대 후반부터 방법론의 춘추전국시대가 열리게 된다.
자... 여기서부터, 나의 게임관이 펼쳐진다. 디자인 패턴을 재미있게 읽기 위해 반드시
거쳐가야하는 놀라운... 게임관이다.
[게임]
Any Where, Any
Time, Any Game
게임은 인생이다.
아니, 내게 게임은 또 다른 형태의 완전한 세상이다. 모든
것이 있다.
* AnyWhere
게임은 항상 내 곁에 있다. 학교에서는 Portable Game Mashine, 겜방에서는 PC, 길거리에서는
휴대폰... 난 어디에서든 게임을 즐긴다.
* AnyTime
난 상항 게임을 한다. 심지어는 자면서도 게임을 한다. 게임안에는 나의 분신(GameAgent)이 있다. GameAgent는 허드렛일을 도맡아서 한다. 내가 밥먹고, 잠자는 시간처럼 바쁠때는 스스로를 키워나간다. 내가 게임에 임할때 GameAgent는 나의 행동을 모두 배우고 스스로 규칙화하며, 내가
없을 때 나를 대신한다. 물론 그는 나의 통제하에 존재한다. 나는
24시간 게임을 즐긴다.
* AnyGame
나의 인생이 하나인 것처럼, 나에게 모든 게임은 하나다. 게임안에 시뮬레이션, 아케이드, 롤플레잉
등 모든 게임이 통합되어있다. 그들 게임은 캐릭터를 공유하며, 서로간
영향을 미친다. 철인경기에서 우승할 수록, 기본 전투력은
급성장하며, 레이싱에서 우승할 수록 나의 지적 판단능력은 높아만 간다.
나는 영웅이며 나는 모든 것을 누릴 수 있는 능력과 권한이 있다. 나는 무적이다.
음... 패턴이란 무엇인가를 설명하는 것은 재미없고, 당신이 하고 있는 것들 중 어떤 것을 패턴이라고 말하는 것인지만 알려주면...
끝.
[우리나라에서 가장 많이 쓰이는 패턴]
* 가쓰(가장 많이 쓰는) 패턴 - BFP(Brute Force Pattern) : 일명 노가다 패턴, 무뇌 패턴이라고도
한다.
* 다쓰(다음으로 많이 쓰이는) 패턴 - CPP(Cut & Paste Pattern) : 재사용이라는 심오한(!) 철학을
사용하기 시작했다. 설사 남이 만든 코드라도 쓰고 말겠다는 적극적 의지가 돋보였으며, 학교를 통해 CPP를 철저히 익힌후 실제 프로젝트에 지속적으로 적용하였다. 다만 품질 있는 코드의 재사용이 아닌 무분별한 재사용이라는 점 때문에 패턴을 계속 쓰다 보면. 정제되는 느낌 보다는, 음식 냄새가 코드에 스며드는 기분 나쁜 경험을
할 수 있다는 점이 있다. 우리 나라의 뚝배기 스타일이 아닌 스파게티와 꽈배기라는 음식냄새가 코드에서
풀풀 나기 시작한다.
재사용을 좋아하지만 스파게티나 꽈배기를 싫어하는
사람들을 위한 패턴은 없을까?
드디어... 진짜
칼을 뺄 때가 왔군... 슈슝. 나의 칼을 받아라.

이올린에 북마크하기
이올린에 추천하기

templates_younghoe@20081111.xml