10년 전 코딩 이야기: 윈도우 프로그래밍

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 핸들을 받는데,

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow){

이것은 메모리가 아주 제한적이었던 16비트 시절의 유물이다. 그 때는 같은 프로세스를 중복해서 띄우면 그 이미지를 공유하였다. 그 외에도 메시지 인자에서 16비트 워드를 두 개로 포개어서 보내는 경우 역시 16비트의 잔재였다. 인텔 x86과 마찬가지로 하위 호환성이 생명인 그들로서는 어쩔 수 없는 선택이었다.

Win32 API를 공부하면서 참으로 많은 것을 배울 수 있었다. 단순히 함수 사용법이 아니라 그 속에 담긴 추상화, 일반화와 같은 설계 기술을 배울 수 있었다. 예를 들어, "일반적인 윈도우 행동을 가능케 하기 위해서 어떤 방식으로 인터페이스를 노출해야 하는가?" 혹은, "풀다운 메뉴 함수 군들을 제공할 때 어떤 형태로 디자인을 하는 것이 합리적인가?"와 같은 문제에 대한 답을 얻을 수가 있었다. 그리고 이것은 더할 나위 없는 가장 훌륭한 디자인 패턴 공부이기도 하다. (물론 태생이 C언어 기반이라 완전한 객체 지향은 아니지만 여전히 배울 것은 무궁 무진 하다.)

아무리 답답하게 책을 통해 어댑터가 어쩌고 Façade 패턴이 어쩌고를 외우면 뭐 하는가? 직접 자기가 어떤 대상을 표현하기 위해 추상화 및 일반화를 하면서 생각을 해보는 것이 가장 좋은 디자인 패턴 공부다. 디자인 패턴을 아무것도 모른 채로 설계를 해도 결국 디자인 패턴에서 말 하는 그런 방법으로 갈 수 밖에 없다. 왜냐면 그건 천재들만이 할 수 있는 내용이 아니라, 어느 정도 합리적인 사고만 가지고 있다면 당연히 그렇게 밖에 할 수 없는 방법이기 때문이다. (이야기가 갑자기 딴 곳으로…)

어쨌든 윈도우 프로그래밍을 시작하면서 공부도 할 겸 처음으로 만든 프로그램이 테트리스 게임이었는데, 나름대로 좋은 연습 수단이 되었다. 책만 봐서는 안 된다. 뭐든 아무거나 만들어가면서 자기가 직접 생각하고 만들어 봐야 실력이 는다. 그 당시 만든 테트리스는 이름하여 "Tetris Classic" 지금 한 번 돌려보니 역시 몹시 쪽팔리구나… 사실 이거 어디 천리안 같은 자료실에 올려서 다운로드 수를 제법 기록했던 기억도 -_-;

by object | 2007/07/11 00:06 | 컴퓨터 | 트랙백 | 덧글(14)
트랙백 주소 : http://minjang.egloos.com/tb/1328647
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 가이우스 at 2007/07/11 02:32
10년 전이라면야... 당시 C언어를 전혀 접하지 못했던 아쉬움이 진득하게 남아있네요.
분당에 이사왔더니,서점도 딱히 없고.. 그 전에 C언어가 뭔지...전혀 몰랐거든요.GW 베이직정도는 알았지만,
자세히 뭔지는 몰랐고.. PC통신같은 곳에 정보를 구할수야 있었지만, C언어가 뭔지도 모르는 그때야
그냥 막연히 프로그래머가 될거야! 했었습니다만, 마이컴이라던가 프로그램세계 같은 잡지라도
한 번 접할 수 있었으면 어땠을까하는 생각이 있습니다. 지금생각하면 아쉬울 따름이죠...
Commented by object at 2007/07/11 02:41
특정 언어를 접하느냐 못 하느냐는 지금 생각해보면 큰 문제는 없는 것 같습니다. 저도 C언어는 대학교 와서야 비로서 만졌거든요. 어차피 중요한 건 알고리즘이나 생각하는 힘이니 GW-BASIC 가지고도 얼마든지 열심히 할 수 있죠. 저는 왜 C언어에서 문장 끝에 ;를 넣어야하는지, 왜 귀찮게 변수를 일일히 선언해야하는지 처음엔 마구 불평했습니다. 물론 언어가 가지는 여러 가치관이나 그런 것이 영향을 미치기는 하지만..
Commented by 가이우스 at 2007/07/11 03:31
방황의 대학2년 + 군대 2년 + 삽질 1년 이제 좀 뭘 알 것 같으려니 졸업이 코 앞에 닥쳐와서
어거지로 학교 더 다니고 싶다고 했습니다... 제대 일주일만에 학교 온 것도 있고,
아쉬움이 너무 많아서요. 어쩌다보니 자바도 못건드려봤고 말이죠..
입시교육에 쩌들어있다가 대학의 자유로운 분위기에 적응못하고 2년간 방황이 진짜 크기는 했는데
지금은 필요한 방황이라고 생각하네요.
Commented by object at 2007/07/11 03:41
방황은 누구나 합니다. 저 학부 6년 다니고 졸업했습니다 ㅋㅋㅋ
http://minjang.egloos.com/974373
Commented by 학주니 at 2007/07/11 09:27
21일완성은 정말로 맨 처음에 아무것도 모를 때 봐두는 것도 좋겠더군요.
그거보고 다른책을 보니 좀 이해가 되더라는.. ^^
Commented by jaygarl at 2007/07/11 09:48
비베로 해보고 바로 허접함을 느끼시고 펫졸드 아저씨 책을 보시다니....역시 대단하십니다. 전 비베의 허접함을 느끼고 델파이로 갔는데...ㅋㅋ
윈도우즈 프로그래밍을 무슨 툴 다루듯이 하다가.. 펫졸드 아저씨 책을 봤는데...보면서 진즉에 볼껄하는 후회가 잔뜩...그때..메세지 후킹 열심히 해서...한때 유행했던 광고바 들을 속이는 메이크머니 라는 프로그램을 만들어서 떼돈?은 아니고 한 몇백만원 벌었던 기억이 나는군요..ㅡㅡ; 제 프로그램을 쓰는 1300명 추천인들 덕분에..-_-ㅋ
Commented by AnonymousY at 2007/07/11 09:53
뭐죠 테트리스 게임의 저 후덜덜한 퀄리티의 그래픽은...다운 수가 짭짤하셨다는게 웬지 신뢰가 가는데요-o-; 저 털보 아저씨 책은 3판...인가요? 한 때는 저 책에 나온 함수가 Win32 API 함수 전부 다 인줄 알았을 정도로 신봉했었습니다.

주인장님은 햇수로 9년 다니신 셈이군요;; 저도 군대 3년 포함해 햇수로 7년 다녔죠-_- 특례나 회사일 하다보면 7~8년 정도는 보통 다들 하지 않나 싶습니다. 과목 면담 할 때 교수님께서 친히 "졸업 좀 해"라고 해주셨;;
Commented by object at 2007/07/11 11:39
21일 완성 시리즈 저 좀 좋아합니다 ㅎㅎ.. 자바, C, C++, Visual C++ 다 그걸로 시작했다는... 일단 시작은 가볍고 빠르게 한번 쓱 보는 것이 좋습니다. C 처음 배우는 사람에게 K&R 책 준다거나 TC++PL 던져주면 그건 정말...

사실 97년만 해도 MFC가 대세라기 보다는 그렇게 많이 쓰여지지 않았습니다. 여전히 볼랜드의 OWL 및 IDE도 막강하였고... 그래서 정보를 구해보니 Win32 API를 공부하라고 하더라구요. 여튼 처음 시작을 Win32로 해서 그런지 MFC도 수월했고 여러모로 좋았습니다. 예를 들어, MFC 동호회할 때, 가장 많이 받는 질문 중 하나가 윈도우 창 크기가 조절 안되도록 막고 싶은데요~ 와 같은 질문인데요. 이 질문에 대한 대답은 Win32 API를 공부했다면 아주 쉽게 찾아낼 수 있죠. MFC가 Win32 API를 어떤식으로 추상화했는지만 알면 쉽게 찾을 수 있습니다. 그러네 API를 모르고서는 제대로 이해할 수가 없었습니다. 물론 MFC가 완전히 Win32 API를 추상화하지 않은 이유도 있겠지만, 윈도우 프로그래밍 오래 하시려면 Win32 API는 여전히 필수라고 생각합니다. .NET도 결국 Win32 API를 감싼 것이니 여러모로 도움이 될 것입니다.

저기 있는 WIndows Programming 5 책은 아마 3판이 맞을 겁니다. 또, 저기 테트리스 그래픽은 당시 유행하던 Ulead의 3D 쿨 텍스트 어쩌고하고 포토샵으로 만들었구요. 97년 3월에 입학해서 06년 2월에 드디어 졸업했습니다.
Commented by 백승우 at 2007/07/11 12:02
전 제대하고 전공에 적응못해서(ㅡㅡ) 방황하다 C/C++배울려고(저는 이세상에 C/C++만 있는 줄 알았습니다. 하하) 학원갔는데 자바 배웠습니다. ㅡ ㅡ
저 책 기억해두었다가 한번 봐야겠습니다.^^
Commented by object at 2007/07/11 12:12
뭐 이런말 하긴 그런데 고교시절까진 수업시간에 퍼질러 자는 친구들이 좀 이해가 가지 않았습니다. 그런데 그 심정을 대학교에서 아주 뼈저리게 느꼈습니다. 수업이 무슨 소리인지 하나도 모르면 잠이 오더군요. 그리고 학교 안 가고 폐인이 됩니다. 문제는 저는 이 짓을 대학교 3학년때 했다는 것...
Commented by Roastbeaf at 2007/07/11 15:32
번역서는 "이중 언어"의 압박이 있었지요. (원어가 뭘까요 :)
Commented by 백승우 at 2007/07/12 08:29
수업이 무슨 소리인지 하나도 모르면 잠이 오더군요. <--- 공감합니다.^^
저도 전공중에 교수님께서 칠판에 적는게 떡인지 밥인지 모르고 멍한 눈으로 봤던 기억이 나네요. 시험도 거의 백지 냈는데, 평소 교수님 컴퓨터 이상이 생기면 자주 고쳐주곤했는데.. 그것때문인지 D정도일 시험에 C+을 주셨더라구요.. ㅎㅎㅎ
Commented by 후리스 at 2007/07/29 15:48
우아.... 저 테트리스게임;; 저희 식구들이 젤 즐겨했던 게임인데... 반갑네요
Commented by object at 2007/07/29 16:12
저도 반갑습니다 --;

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
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
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스