목표
Window API를 사용하기 위한 기초 배경을 쌓도록 하겠습니다.
목차 클릭하면 해당 목차로 이동합니다.
개요
윈도우즈 프로그래밍이라는 수업을 듣게 되어 학습 과정을 기록하려고 합니다. 대학교에 진학해서 제일 먼저 배운 것이 C언어였습니다. 과제 제출과 매크로 프로세서, 어셈블러, 어휘 분석기 등 이론적인 내용을 만들어 본 적이 있지만, 제가 만들고 싶었던 프로그램들은 만들어 본 적이 없습니다. 제가 구상하는 프로그램들은 대부분 GUI 기반이거나 웹, 앱 등의 환경에서 작동하는 프로그램이고, C언어보다 더욱 편리하고 효율적인 언어들이 많았기 때문입니다. 사실, 효율적이라는 말은 조금 모호합니다. 제 지식이 짧았을 수도 있고, 단순히 Python과 같은 언어들의 접근성이 좋았기 때문일 수도 있습니다. 이번 기회에 C언어와 WIN32 API를 이용해서 제가 원하는 프로그램을 만들어 볼 예정입니다.
따라서, WIN32 API Programming 카테고리에는 수업을 기반으로 제가 배운 내용과 진행하게 될 프로젝트를 위한 지식들을 작성할 예정입니다.
API와 MFC
프로젝트를 할 때 API라는 말을 참 많이 듣습니다. 특히, RESTful API를 많이 사용하곤 하는데요.
API는 Application Programming Interface의 약자입니다. 어플리케이션을 만드는 인터페이스라고 직역할 수 있는데요. 그래서 인터페이스라는 말을 알아야 합니다.
인터페이스(Interface)
인터페이스는 UI(User Interface), GUI(Graphic User Interface) 등 우리가 알게 모르게 많이 사용하는 말입니다. 인터페이스는 서로 다른 두 개의 시스템이나 장치 사이에서 정보나 신호를 주고 받는 접점이나 경계면을 뜻합니다. 글로 보는 것보다 예시를 통해 이해하는 것이 수월하기 때문에 예시를 통해 알아보도록 하겠습니다. 예를 들어 핸드폰 충전 포트를 생각할 수 있습니다. 핸드폰에는 핸드폰과 핸드폰 충전기를 이어주는 구멍(포트)가 있습니다. 갤럭시는 C타입, 아이폰은 8핀, USB-C 등 여러 종류가 존재합니다. 이 종류가 맞아야 충전기를 연결해 충전을 할 수 있습니다. 또 다른 예로는 위에서 말한 UI가 있습니다. 보통 게임을 할 때 게임 화면을 UI라고 합니다. 게임과 유저 사이를 이어주는 접점이 바로 이 화면입니다. 화면을 통해 게임을 조작하고 즐길 수 있는 것입니다. 개발을 할 때, 백엔드와 프론트엔드 사이의 통신을 API를 통해서 할 수 있습니다. 백엔드와 프론트엔드 사이의 접점, 즉 연결해주는 다리와 같은 역할을 합니다. 이 API를 통해 데이터를 주고 받는 것입니다. 이렇게 두 사이의 접점을 인터페이스라고 합니다.
API와 MFC
본론으로 돌아와서, API란 어플리케이션을 만들기 위한 개발자와 프로그램 사이의 접점이라고 할 수 있습니다. 운영체제나 프로그래밍 언어에서 제공하는 프로그램을 개발자가 사용할 수 있도록 도와주는 역할을 합니다. 이번에 제가 다룰 것은 마이크로소프트사에서 제공하는 Window API입니다. Window API는 마이크로소프트사에서 만든 *SDK를 이용해서 프로그램을 작성할 수 있도록 도와주는 것입니다. C언어 기반의 함수 라이브러리로 모든 윈도우 프로그래밍 환경에서 사용 가능합니다.
*SDK : Software Development Kit의 약자로, 프로그래밍 언어나 기업에서 제공하는 일련의 툴을 의미합니다.
MFC는 Microsoft Foundation Class Library의 약자로, Window API의 C++ 버전이라고 생각하시면 됩니다. 클래스로 구현되어 API보다 객체지향적으로 프로그래밍이 가능하도록 설계되어 있습니다. 객체가 없어지면(메모리 할당이 끝나면) 자동으로 핸들을 해제하게 되는 것이 특징입니다.
API와 MFC는 모두 윈도우 프로그래밍 환경에서 사용 가능합니다. MFC의 경우 MAC OS에서도 사용 가능하도록 개발했지만 계속해서 개발하지 않아 거의 사용할 수 없는 상황입니다.
그래서 WIN32, Windows API는 마이크로소프트에서 제공해주는 프로그래밍 API입니다. C, C++언어를 기반으로 다양한 프로그래밍이 가능합니다. 앞으로 우리는 WIN32 API Programming 카테고리에서 이와 관련된 내용을 다룰 예정입니다.
윈도우 프로그래밍 동작 방식
우선 기본적인 용어부터 익히도록 하겠습니다. 앞으로 응용 프로그램, 윈도우 등의 단어들이 나오면서 여러가지 코드가 나옵니다. 여기서 말하는 윈도우는 운영체제 Window를 말하는 것이 아닙니다. 응용 프로그램 안에 작동하는 화면을 의미하는 것입니다. 예를 들면, 메모장이라는 응용 프로그램을 키면 안에 글을 쓰는 하얀색 창이 있습니다. 이 하얀색 부분, 즉 우리가 작업하는 부분을 윈도우라고 합니다. 메모장 자체는 응용 프로그램입니다. 그림으로 표현하면 다음과 같습니다.
앞으로 코드를 통해 실습하면서 점점 확대해 나가도록 하겠습니다.
윈도우 프로그래밍의 동작 방식을 알기 위해서 먼저 구성 요소는 다음과 같이 4가지로 이루어져 있습니다.
- 메세지(Message)
- 메세지 큐(Message Queue)
- 메세지 루프(Message Loop)
- 윈도우 프로시저(Window Procedure)
메시지(Message)
메시지는 윈도우에 발생하는 모든 이벤트(사건)을 의미합니다. 키보드로 입력하고, 마우스로 클릭하는 것 뿐만 아니라, 마우스가 이동하는 등의 사소한 이벤트들을 모두 메시지로 관리합니다. 윈도우 내에서 발생하는 대부분의 이벤트들은 이미 미리 정의가 되어 있습니다. 그렇다면 개발자들이 이런 사소한 이벤트들을 모두 코드로 관리해야할까요?
당연히 그렇지 않습니다. 각 윈도우에 어떤 사건이 발생하는지 지속적으로 확인하고 메시지로 만들어서 처리하는 것은 모두 운영체제의 역할입니다. 윈도우 내에 어떤 사건이 발생하면 운영체제는 메시지를 만들어서 해당 윈도우가 속한 메시지 큐에 저장하게 됩니다.
메시지 큐(Message Queue)
운영체제가 만들어낸 메시지는 메시지 큐에 저장하게 됩니다. 자료구조에서 배웠듯 큐 특성상 FIFO 구조로 먼저 들어온 메시지를 순차적으로 먼저 처리하게 됩니다. 해당 매시지들은 매크로 상수로 변환되어 메시지 큐에 저장됩니다. 이는 개발자의 편의를 고려한 것이라고 생각됩니다.
메시지 루프(Message Loop)
메시지 루프는 메시지 큐에 들어있는 메시지를 읽어서 처리를 위해 윈도우 프로시저로 전송하는 반복문입니다. 메시지에 따라서 알맞은 형태로 변환해서 윈도우 프로시저로 전송합니다.
윈도우 프로시저(Window Procedure)
메시지 루프에서 알맞은 형태로 변환된 메시지를 받습니다. 이렇게 전송받은 메시지를 사전에 정의된 내용에 맞게 처리하는 함수입니다. 사전에 정의된 내용은 당연히 개발자가 작성해놓은 것이겠지요. 개발자는 프로시저의 메세지 처리방식을 정의해서 프로그램을 개발하게 됩니다.
해당 과정을 프로그램이 끝날때까지 계속해서 반복하게 됩니다.
우리가 화면에 Hello World를 출력하던지, 그림을 그리던지, 동영상을 보여주던지, 소리를 내던지 등은 모두 윈도우에 출력하는 것입니다. 이런 윈도우의 출력에는 다음과 같은 특징이 존재합니다.
디바이스에 비의존적(Device-independent)
출력하고자 하는 장치의 종류에 따라 출력 방법이 달라지지 않는다는 뜻입니다. 쉽게 말하면, 우리가 화면에 글씨를 출력한다고 가정해보겠습니다. 사용자는 모니터에 화면을 띄워놓고 있을텐데요. 이 때 사용하는 모니터는 천차만별입니다. 모니터를 만드는 제조업체는 엄청 많기 때문인데요. 삼성,LG,DELL 등등 당장 생각나는 것만 5개가 넘습니다. 그럼 이 제조업체마다 해상도도 다르고 크기도 다르고 내부 소프트웨어의 구성도 다를텐데 이것에 다 맞춰서 프로그램을 설계해야할까요? 당연히 그렇지 않습니다. Window API에서 GDI를 제공하기 때문입니다. GDI는 Graphic Device Interface의 약자입니다. GDI는 어떤 디바이스에든 주어진 내용에 맞게 출력될 수 있도록 사용할 수 있는 함수들을 의미합니다. 이 함수들과 디바이스 드라이브가 해상도나 크기 등을 조절해서 사용자가 편하게 사용할 수 있도록 만들어줍니다.
GDI와 더불어 윈도우에 출력하는 과정에 대해서 다음 포스팅에서 구체적으로 다루어보도록 하겠습니다.
정리
Window API를 사용해서 프로그램을 작성하기 위한 기초 배경에 대해서 알아보았습니다. 항상 무언가를 만드는 상황에서는 파이썬이나 자바를 선택해야 한다고 생각했는데, C언어를 통해서 어떤 프로그램을 작성할 수 있는지 알아보도록 하겠습니다. 프로그래밍을 배우면 가장 먼저 배우는 언어인데, 어떻게 진행될지 아주 기대됩니다!
'개발 > Win32 API Programming' 카테고리의 다른 글
[Windows API] Device Context란?, Win32 API를 활용해 문자열 출력하기 (0) | 2021.12.31 |
---|---|
[Windows API] Win32 API의 기본구조, 윈도우 프로시저 (0) | 2021.12.26 |
[Windows API] Win32 API의 기본구조, WinMain-(2) (0) | 2021.11.05 |
[Windows API] 윈도우 프로젝트 생성과 WIN32 API의 기본 구조-(1) (0) | 2021.11.03 |
[Windows API] Win32 API에서 제공하는 자료형(데이터 타입) 모음과 핸들(HANDLE) (0) | 2021.10.07 |