#7. Windows 프로그래밍 이론 되짚어보기

Windows 프로그래밍… 서론으로 들어가면서 이 이야기를 하고 싶다. 이것은 현재 .NET 플랫폼으로 그 추세를 옮겨갔고 이제는 Visual Studio.NET까지 발매되었다. 그렇다면, 이 시점에서 우리는 너무나도 뒤쳐졌다는 허탈감에 빠져있기 쉽다. 하지만, 그런 허탈감을 가지기에는 너무나 불충분한 이유들 뿐이다. 실질적으로 .NET은 대기업을 위한 인프라이며 일반적일 수 없는 것이다.


어제 처음 개강한 후에 이론 설명을 했던 것을 되짚어 보자.


우리는 이제껏 DOS의 단방향 처리형태의 프로그래밍만을 배워왔었다. 이것은 가장 많은 것을 이룰 수 있으며 가장 많은 노가다를 요한다. 하지만 Windows 프로그래밍은 가장 많은 것을 가져다주며 가장 적은 동작만을 필요로 한다. 그와 동시에 역할 분담, 즉 사회화 과정을 포함하였다고 할 수 있겠다.


Windows 프로그래밍은 MFC를 가지고서 할 수 있지만 어떤 경우는 API를 이용하여 순전히 메시지만을 가지고서 처리하는 경우도 있다. 어떤 경우이더라도 각각의 장단점이 존재하며 이 둘을 적절히 부합시키는 것이 최고의 프로그램을 제작하는 기초일 것이다.


Windows는 이벤트와 메시지가 가장 중요한 시스템의 신진대사이다. 이것없이는 Windows조차도 단방향 시스템일 뿐이다. 이벤트는 특정 시간이나 동작에 의하여 이루어지게 된 사건을 가리키는 용어이고, 메시지는 그러한 이벤트를 육하원칙에 따라서 기록한 정보 구문이다.


메시지 큐는 이런 메시지들을 담고 있는 저장소이다. 이것은 무한 루프를 돌면서 끊임없이 그 정보를 수용하고 해당 프로세스에게 전달해 준다.


프로시저는 이러한 동작을 수행하는 일련의 단계를 일컫는 용어이다. 이것을 선언하기 위하여 운영 체제만을 위한 CALLBACK 함수를 사용하게 되며, 메시지 루프로부터 가져온 메시지들을 6하원칙대로 구별지어 작업을 행하게 된다.


핸들은 프로그램에서 현재 사용중인 객체 (예를 들어 윈도우, 커서, 아이콘, 메뉴 등)을 식별하기 위해 윈도우가 부여하는 고유 식별 번호가 핸들이며, 이것은 32비트형 정수 자료이다. 객체의 이름이 중복될 수도 있음을 감안한 것이다. 이는 생성되는 순서대로 생성되며 이러한 핸들값을 저장하기 위하여 Windows는 핸들 테이블을 만들어둔다. 이 핸들 테이블에 생성되는 순서대로 저장된다.


응용프로그램 -> 핸들 테이블 -> 메모리 주소


인스턴스 (Instance) = 객체 (Object) 이것은 실제 메모리 상에 할당된 객체를 인스턴스 (Instance)라고 호칭한다. 프로그램은 일련의 명령들이 나열된 코드 영역 (Code Area) 또는 코드 세그먼트 (Code Segment)와 데이터를 보관하는 데이터 영역 (Data Area) 또는 데이터 세그먼트 (Data Segment)로 구분한다. 이러한 영역내에 객체가 저장되는 것으로, 이렇게 저장된 객체는 인스턴스이며 이 인스턴스가 객체로 승화되는 것이므로 결국은 같은 의미이나, 개념의 차이일 뿐이다. Code Segment는 프로그램마다 같은 부분에 한하여 공유되는 형식을 취하지만 Data Segment는 그 데이터 각각을 모두 다른 별개의 것으로 여긴다. 메모리의 절약을 위한 관리 형태라고 할 수 있다.


리소스 (Resource)는 메뉴, 아이콘, 커서, 다이얼로그 등 사용자 인터페이스를 구성하는 자원들의 정적인 데이터들이다. 리소스 스크립트(Resource Script)에 의하여 정의 될 수 있다. 리소스 스크립트는 ASCII 타입의 .RC 파일을 RC.EXE라는 컴파일러로 컴파일하면서 .RES로 변환되어 IDE에서 사용할 수 있는 이진 형태의 파일로 컴파일된다. 실제로, .RC 파일을 텍스트 에디터를 사용하여 직접 편집하여줄 수도 있으며 eXeScope나 Resource Hacker와 같은 도구를 사용할 수도 있겠다.


IDR_MAINFRAME MENU PRELOAD DISCARDABLE


POPUP “파일(&F)”


BEGIN


MENUITEM “새 파일(&N)Ctrl+N”, ID_FILE_NEW)


MENUITEM “열기(&O)Ctrl+O”, ID_FILE_OPEN)



END


END  

댓글 남기기