|
10년 전 일기장? 10년 전 코드에 이은 10년 전 코딩 이야기 그 두 번째. 오늘은 윈도우 프로그래밍을 막 시작했던 때를 떠올려 보려고 한다. 어쨌든 처음 대학 입학해서 1학기 동안 C 언어 문법을 대충 공부하고, 바로 윈도우 프로그래밍을 시도해보았다. 초등학교 시절부터 워낙 Basic을 좋아했던 터라 사실 시작은 Visual Basic으로 시작하였다. 그러나 곧 허접함을 느끼고 바로 C언어를 공부했으니 Visual C++을 해야겠다고 맘을 먹는다. 그리고 처음 샀던 책이 그 전설의 "21일 완성" 시리즈였다. 이 책에서는 MFC를 바로 가르치고 있는데 처음 시도한 프로그램이 바로 아래와 같은 MFC Wizard가 생성해주는 다이얼로그 박스 기반의 프로그램이었다.
여기까진 오오~ 그러면서 감탄을 하였다. 그러나 웬걸… 엔터를 누르니 그냥 프로그램이 닫기는 것 아닌가? 또, ESC만 눌러도 그냥 닫기더라. 나는 이것이 몹시 짜증이 나서 이 기능을 고치고 싶었는데 "21일 완성" 책에서는 도저히 찾을 수 없었다. 좀 황당하지만 이 이유 때문에 MFC 대신에 Win32를 바로 공부하게 되었다. 뭔가 내가 모르는 일이 밑 바닥에서 이루어지고 있는 것이 미덥지 않았기 때문이다. (Enter/ESC를 누르면 닫기는 것은 CDialog::OnOK와 OnCancel 때문이고, 이 두 함수를 overriding 하거나 PreTranslateMessage를 해주면 막을 수 있다. 이 과정을 온전히 다 이해하기 까지는 그 뒤로 1년이 더 걸렸다.) 그래서 거의 10년 전 이 맘 때, 여름 방학이 시작하자마자 전설적인 Charles Petzold의 Programming Windows 95를 구입하였다. 사실 처음에는 교학사에서 번역한 것을 먼저 구입하였는데, 한글 번역에 두 손 두 발 다 들고 결국 원서를 구입하였다. 예를 들어, 윈도우에서는 윈도우 메시지를 PostMessage 혹은 SendMessage로 보낼 수 있는데, post와 send를 한글로 번역하고 있어서 아주 돌아가시는 줄 알았다. 그리고 윈도우 메시지를 처리하는 콜백 함수인 Window Procedure (WNDPROC)도 이상하게 한글로 번역을 하기도 하였다. ![]() 이 책이 윈도우 프로그래밍의 바이블이라는 것을 주저할 이유가 전혀 없다. 명쾌한 해설과 적절한 예시, 군더더기 없는 핵심만을 심도 있게 다루기 때문에 윈도우 프로그래밍에 있어서 insight를 가지게 하는데 아주 좋았다. 단, 하나 단점이 있었다면 4장에 너무 복잡한 GDI 그래픽 관련 내용이 나와서 지치는 감이 있었다. 다행히 다음 판에서는 이 내용이 뒤로 옮겨져서 초보자가 읽기에 더욱 수월해졌다. 윈도우 프로그래밍을 하면서 일종의 quantum jump를 경험한 것은 "Windows가 Window들로 이루어져있다" 라는 사실을 깨닫고 나서이다. 윈도우의 "시작" 버튼이 하나의 "Window"라는 사실을 알고 나니 복잡해 보이기만 한 윈도우 프로그래밍이 아주 쉽게 다가왔다. 이것은 비록 Win32 API가 C로 만들어져 있지만 그 설계는 철저히 객체지향적으로 되어있음을 뜻한다. 표현이 C언어와 콜백함수라는 다소 직관적이지 않을 뿐이지 기본 철학은 결국 재사용과 객체지향일 수 밖에 없다. 10년 전만 하더라도, 여전히 Win16 환경에서 만들어진 프로그램들이 많았고, 막 32비트 윈도우 프로그래밍이 보급된 시기이기도 하였다. 그래서 Windows 95에서 소개된 Win32 API는 16비트에서 확장한 부분을 쉽게 발견할 수 있다. 예를 들어, 윈도우 프로그래밍의 entry point인 WinMain 함수는 두 번째 인자로 previous instance 핸들을 받는데,
이것은 메모리가 아주 제한적이었던 16비트 시절의 유물이다. 그 때는 같은 프로세스를 중복해서 띄우면 그 이미지를 공유하였다. 그 외에도 메시지 인자에서 16비트 워드를 두 개로 포개어서 보내는 경우 역시 16비트의 잔재였다. 인텔 x86과 마찬가지로 하위 호환성이 생명인 그들로서는 어쩔 수 없는 선택이었다. Win32 API를 공부하면서 참으로 많은 것을 배울 수 있었다. 단순히 함수 사용법이 아니라 그 속에 담긴 추상화, 일반화와 같은 설계 기술을 배울 수 있었다. 예를 들어, "일반적인 윈도우 행동을 가능케 하기 위해서 어떤 방식으로 인터페이스를 노출해야 하는가?" 혹은, "풀다운 메뉴 함수 군들을 제공할 때 어떤 형태로 디자인을 하는 것이 합리적인가?"와 같은 문제에 대한 답을 얻을 수가 있었다. 그리고 이것은 더할 나위 없는 가장 훌륭한 디자인 패턴 공부이기도 하다. (물론 태생이 C언어 기반이라 완전한 객체 지향은 아니지만 여전히 배울 것은 무궁 무진 하다.) 아무리 답답하게 책을 통해 어댑터가 어쩌고 Façade 패턴이 어쩌고를 외우면 뭐 하는가? 직접 자기가 어떤 대상을 표현하기 위해 추상화 및 일반화를 하면서 생각을 해보는 것이 가장 좋은 디자인 패턴 공부다. 디자인 패턴을 아무것도 모른 채로 설계를 해도 결국 디자인 패턴에서 말 하는 그런 방법으로 갈 수 밖에 없다. 왜냐면 그건 천재들만이 할 수 있는 내용이 아니라, 어느 정도 합리적인 사고만 가지고 있다면 당연히 그렇게 밖에 할 수 없는 방법이기 때문이다. (이야기가 갑자기 딴 곳으로…) 어쨌든 윈도우 프로그래밍을 시작하면서 공부도 할 겸 처음으로 만든 프로그램이 테트리스 게임이었는데, 나름대로 좋은 연습 수단이 되었다. 책만 봐서는 안 된다. 뭐든 아무거나 만들어가면서 자기가 직접 생각하고 만들어 봐야 실력이 는다. 그 당시 만든 테트리스는 이름하여 "Tetris Classic" 지금 한 번 돌려보니 역시 몹시 쪽팔리구나… 사실 이거 어디 천리안 같은 자료실에 올려서 다운로드 수를 제법 기록했던 기억도 -_-; ![]()
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04 저도 아들 돌잔치때 돌잡이 .. by 박상욱 at 01/18 미국 대학원 원서 작성중에 p.. by 태클사이야 at 01/13 TO: 박PD 로그인 하지 않아.. by 박응용 at 01/10 http://gigglehd.com/zbx.. by dhunter at 12/28 우와.. 좋네요. 태반이 .. by 윤광배 at 12/17 항상 좋은 글 잘 보고 있습니.. by y2k at 11/23 글이 좋아서 제 블로그에 담.. by 쏭섭 at 11/23 최근 등록된 트랙백
메뉴릿
이글루 파인더
|