개요
1학기 게임 프로그래밍 시간이 CMD 콘솔에서 진행됐다면 2학기 게임 프로그래밍 시간은 윈도우 창에서 진행될 예정입니다.
WinAPI라는 것을 사용하기 때문이고 나중에 DirectX를 배우기 위해 꼭 배워야할 과정이기도 합니다.
WinAPI란?
WinAPI란게 무엇이냐 하면...
일단 WinAPI를 풀어 써보면 Windows Application Programming Interface입니다.
여기서 Interface란? 서로 다른 두개의 시스템 장치 사이에서 정보나 신호(상호작용)를 주고 받는 창구입니다.
저희가 UI 라고 부르는 것도 User Interface. 즉, User 과 내부 시스템의 상호작용이죠.
그러면 API는 대체 뭐냐면 어플리케이션을 만들기 위한 개발자와 프로그램 사이의 창구입니다.
그러니 WinAPI는 Windows와 프로그래머의 창구이지만 간단하게 Windows에서 제공해주는 함수의 집합체입니다.
무얼 만들것이냐 하면...
저희가 WinAPI로 만들건 윈도우 응용 프로그램 입니다.
그냥 그림판이나 메모장 이런것들 말이죠.
물론 그런게 최종 결과물이 되진 않을겁니다.
'게임 프로그래밍' 과목인데 당연히 WinAPI로도 게임을 만들어야겠죠.
알아야 할 것
리소스(Resource)
리소스는 각종 하드웨어 장치(CPU, GPU)나 저장 장치(RAM, HDD, SSD) 등에 들어있는 데이터 자료를 총칭하는 단어입니다.
그냥 '이것도 리소스 인가?' 싶은 것들도 웬만해선 리소스입니다.
리소스 사용 및 반납
모든 윈도우 응용 프로그램은 운영체제가 제공하는 함수를 사용한 뒤에 운영체제에 다시 반납하는 형식으로 돌아갑니다.
매우 중요하다고 들었는데 지금까지 배운것중에 이것이 별로 체감가는건 없었습니다.
인스턴스와 핸들
개인적으로 가장 중요하다고 생각하는 요소입니다.
일단 인스턴스는 잠시 스킵하고 핸들부터 볼까요?
핸들(Handle)이란게 뭐죠?
기계·기구·자동차·선박 따위에서, 그것을 운전·작동하는 손잡이. 순화어는 `운전대'.
라고 구글이 저에게 알려주었습니다.
뜻이 상이하진 않습니다. 이렇게 된김에 자동차로 예를 들어볼까요?
여기 한 대의 자동차가 있습니다. 지금 우리는 운전석에 앉아 있죠.
차를 타고 평화롭게 주행하던 중, 아래와 같은 도로 상황을 만났습니다.
이제 좌회전을 해야 합니다.
이때, 우리가 직접 내려서 바퀴를 왼쪽으로 돌릴까요? 아니죠. 우리는 운전대, 즉 핸들을 돌립니다. 핸들을 왼쪽으로 돌리면, 그에 따라 바퀴도 왼쪽으로 회전하게 됩니다.
이 상황에서 유심히 봐야할 것은 우리가 직접 바퀴를 조작하는 것이 아니라 핸들을 통해 간접적으로 바퀴를 조작하고 있다는 점입니다.
프로그래밍에서의 핸들도 비슷합니다.
프로그래밍에서 핸들이란, 운영체제나 프로그램이 내부의 리소스를 관리하기 위해 제공하는 식별자입니다. 이 핸들을 통해 우리는 해당 리소스를 간접적으로 조작할 수 있습니다.
핸들은 내부 리소스의 주소를 치환한 값이며 이것을 운영체제에게 전달하면 핸들 테이블에서 해당 값에 해당하는 리소스를 가져와 해당 리소스의 값을 전달합니다.
사실 포인터를 사용하면 훨씬 간단하게 조작할 수 있는데도 왜 이런 방식을 사용하느냐 하면 보안성 때문입니다.
만약 저희가 나쁜 의도로 프로그램을 만들어서 운영체제의 중요한 부분을 삭제해 버리거나 작동 불능으로 만들어버리면 운영체제가 동작 불가능한 상태가 되어버립니다.
그렇기 때문에 포인터 대신 핸들이라는 대체제를 제공한다는 뜻이죠.
단순하게 C# 프로퍼티의 {get private set;} 이나 readonly 같은 키워드를 생각하면 쉽습니다.
get만 가능하고 set은 불가능한 그런거죠.
아무튼 이건 전체적으로 쓰이는 핸들의 설명입니다.
이정도만 알아둬도 딱히 지장은 없습니다.
그리고 인스턴스란게 뭐냐구요?
인스턴스(Instance)란 우리가 조작하고자 하는 객체입니다.
이름부터 객체에요. 참 정직하죠?
다시 자동차를 꺼내보죠.
네. 이게 바로 인스턴스 입니다.
저흰 이 자동차를 직접 만지는 대신 핸들을 통해 조작한다고 했었죠? 바로 이 점에서 핸들과 인스턴스의 관계를 이해할 수 있습니다.
핸들은 운영체제나 프로그램이 인스턴스를 안전하고 간편하게 조작하기 위해 제공하는 간접적인 조작 장치입니다. 즉, 인스턴스는 우리가 실제로 다루고자 하는 대상이고, 핸들은 그 인스턴스를 다루기 위한 도구인 셈이죠.
자동차에서의 핸들은 액셀, 브레이크, 핸들, 기어봉 이런것들이라고 할 수 있겠죠.
여기서 하나 더 챙겨가야할 점은 '아무리 많은 자동차가 있어도 모든 자동차는 똑같은 인스턴스이다.' 정도겠네요.
조금 의아하지만 '어떠한 프로그램인지' 식별하기 위해서 부여하는 값이 바로 인스턴스입니다.
그러니까, 메모장을 100개 열었을때 모든 메모장은 같은 인스턴스를 가집니다.
그래서 그 인스턴스를 구분하기위해 윈도우란걸 사용합니다.
아무튼 이건 다음 글에서 마저 설명하죠.
메시지
윈도우 프로그램의 기본 구조는 메인 부분과 메시지 처리 부분이 있습니다.
저희가 윈도우 프로그램을 만들었을때 사용자의 입력을 받기 위해선 운영체제가 그에 맞게 발생 시켜주는 메시지를 받아와야 합니다.
이 메시지를 발생시키는 부분이 메인 부분입니다.
운영체제는 메시지를 발생시켜서 메시지 큐(Message Queue)에 저장해놓고 메시지 처리 부분은 그 메시지 큐에 있는 메시지들을 가져다가 메시지에 맞는 코드를 실행시킵니다.
마치는 말
사실상 WinAPI라기보단 핸들과 인스턴스 설명 글에 가까웠지만 뭐 어떻습니까.
진짜 이 글 쓰면서 인스턴스에 대해 이해안가는 부분이 있어서 약 1시간동한 ChatGPT, 구글을 닦달해가면서 정보를 찾았는데 정확하게는 아직도 모르겠습니다.
대충 이해한 바를 설명해보자면 프로세스는 고유합니다.
메모장을 100개 열었을때 각각의 메모장 또한 고유한 프로세스입니다.
하지만 인스턴스는 '프로세스'가 아닌 '모듈' 이라는 것입니다.
클래스에 비유하자면 각 프로세스들은 생성된 객체이고 인스턴스는 생성자 내지는 클래스 자체라는 거죠.
맞는지는 모르겠어요. 제가 괜한거에 힘빼고 있나 싶어서 선생님께 이걸로 연락하기도 뭐합니다.
'개발 > WinAPI' 카테고리의 다른 글
[WinAPI/C++] | Windows 데스크톱 애플리케이션 살펴보기 (2) | 2024.08.27 |
---|