| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- DX
- 수학용어정리
- c++
- c언어정리
- 게임엔진튜토리얼
- 자료구조
- ipc(inter process communication)
- c++porinter
- 언리얼비헤이어비어트리
- 프로그래밍일기
- leveleditor
- 영단어정리
- 언리얼엔진5
- c++용어정리
- 언리얼엔진공부
- directx
- unrealengineai
- 자료형타입
- uaiperception
- 게임개발
- 프로그래밍
- 언리얼엔진
- 언리얼ai
- 월드아웃라이너
- 각도변환
- bttask
- 자료구조정리
- livrary
- 25.06.11dir
- c++class
- Today
- Total
루리코딩 세상
Windows.h 식별자(identifier)란? 그리고, windows.h 에서 활용 본문
식별자( identifier )는 변수, 함수, 클래스 등에 붙이는 이름을 의미합니다. 컴퓨터가 "무엇을 가르키는지" 이해할 수 있도록 프로그래머가 만든 이름과도 같다. 컴퓨터가 처리하는 것은 메모리 상의 0, 1을 활용한 메모리를 저장하는 주소값을 가지지만, 16진수로 이뤄진 주소값을 [scanf]로 확인은 가능하지만 일반적으로 프로그래머가 외우기는 현실적인 어려움이 있는 것이 사실이다.
이러한 문제점을 식별자를 통해서 프로그래머가 읽기 쉬운 이름으로 식별자를 붙이는 것이 바람직하다.
Keyword : 코드 가독성과 유지보수를 위함, 프로그램의 구조 만들기.
- 몇가지의 규칙성을 갖고 있다. 영문, 숫자, 언더바/언더스코어(_)를 사용한다.
- 숫자로 시작할 수 없다.
- int int 식의 식별자는 지정이 불가하다.
- 대소문자를 구별한다. Age와 age는 식별자가 다르다.
메모리 구조와 더불어 보는 식별자.
잘 지어진 식별자는, 그 자체 만으로도 설명이 충분하다. 이름만 봐도 해당 주소값에 선언되어 있는 메모리가 무슨 역할을 하는지에 대한 설명을 해주기 때문에 의미있게 짓는 것이 중요하다. 실제로 컴퓨터는 메모리 주소를 통한 데이터를 저장할 뿐 식별자에 대해서는 전혀 모르는 상태인 것이다. 오직 프로그래머의 편의를 위한 '메모리 주소'에 '이름' 인 것이다. 프로그래머가 영어 공부를 계속 해야하는 이유도 아마 이러한 이유 때문일 것이다.
int studentAge = 10;
float averageScore = 90;
void PrintWelcomeMessage();
// 잘 작성된 식별자의 예
int형으로 메모리를 할당한다. 해당 주소값의 식별자(이름은) : studentAge가 된다.
float형으로 메모리를 할당한다. 해당 주소값의 식별자(이름은) : averageScore가 된다.
void형으로 메모리 공간을 비워둔다. 이곳의 식별자는 PrintWelcomMessage()가 된다.
| 메모리 주소(가상의 숫자) : 컴퓨터가 인식하는 | 값 (내부의 값) | 식별자 : 프로그래머가 인식하는 |
| 0x00FFAA12 | 10 | studentAge |
| 0x00FFAA16 | 90 | averageScore |
windows.h에서 식별자는 어떻게 사용될까.
Windows API에서 식별자는 보통 다음과 같은 것들을 의미한다.
- 함수 이름 → CreateWindowEx, GetMessage, SetWindowText
- 상수 → WM_PAINT, SW_SHOW, CS_HREDRAW
- 자료형 → HWND, HINSTANCE, LPCTSTR, LRESULT
- 매크로 → LOWORD, HIWORD, MAKEINTRESOURCE
✅ 2. Windows API 식별자 작명 규칙
💡 ① 자료형 접두어 기반 (헝가리언 표기법)
Windows에서는 헝가리언 표기법을 자주 사용해요. 이건 자료형의 용도를 앞에 붙여서 구분하는 방법이에요.
| 접두어 | 의미 | 예시 |
| H | Handle (핸들) | HWND (윈도우 핸들), HINSTANCE (프로그램 인스턴스) |
| LP | Long Pointer (포인터) | LPSTR, LPCWSTR, LPVOID |
| P | Pointer | PVOID, PBYTE |
| L | Long (4바이트 정수) | LONG, LRESULT |
💡 ② 상수 이름 규칙
Windows 상수는 보통 전부 대문자이며, 접두어로 용도를 구분해요.
| WM_ | Window Message | WM_PAINT, WM_CLOSE, WM_KEYDOWN |
| SW_ | ShowWindow 플래그 | SW_SHOW, SW_MINIMIZE |
| CS_ | Class Style | CS_HREDRAW, CS_VREDRAW |
💡 ③ 함수 이름 규칙
대부분 낙타표기법(PascalCase)을 사용하며, 동작+대상 형태로 구성돼요.
| CreateWindowEx | 윈도우 생성 |
| ShowWindow | 윈도우 표시 |
| UpdateWindow | 윈도우 다시 그림 |
| GetMessage | 메시지 큐에서 메시지 받기 |
Microsoft 공식 문서 활용하기 / Visual Studio에서 식별자 검색 활용 / Header 파일 열어 내부 함수 보기
https://learn.microsoft.com/en-us/windows/win32/api/
Programming reference for the Win32 API - Win32 apps
This section provides the Win32 API reference documentation organized by technology areas and header.
learn.microsoft.com
| windows.h | 핵심 API 통합 헤더 |
| winuser.h | 사용자 인터페이스 관련 (메시지, 윈도우 등) |
| wingdi.h | GDI (그래픽 처리) |
| winbase.h | 기본 시스템 기능 |
| commctrl.h | 공통 컨트롤 (버튼, 슬라이더 등) |
포스팅을 진행하다보니 식별자에 대해서 명확한 개념에 대해서 이해가 가능했다.
이러한 식별자들은 이미 windows.h에만해도 수천개가 선언되어있다하니, 프로그래머에게 리서치를 하는
능력도 꽤나 중요한 것을 알게됬다. 내 코드와 충돌이 발생이 되지 않도록 구조를 구현해내는 것도 중요하지만,
필요한 이벤트를 실행시키기 위한, 식별자를 잘 활용하는 것도 매우 중요해보인다.
클래스 문을 활용하자.
windows.h를 한 번 인클루드(#include <windows.h>)하면, 그 헤더에서 정의된 모든 윈도우 API 식별자들(함수, 매크로, 타입 등)을 해당 소스 파일 내에서 자유롭게 사용할 수 있다.. 그리고 그 파일 내에서 선언한 클래스 (예시로 선언하는)CShader의 멤버 함수(메서드)에서도 windows.h의 내용을 문제없이 쓸 수 있다. 예를 들어, CShader라는 클래스를 선언하고 멤버 함수 안에서 HWND 타입 변수를 선언하거나, CreateWindow() 같은 윈도우 API 함수를 호출하는 게 가능하다.
#include <windows.h>
class CShader {
public:
void InitializeWindow() {
// 윈도우 API 함수 호출 가능
HWND hwnd = CreateWindow(
L"STATIC", L"Example Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
NULL, NULL, GetModuleHandle(NULL), NULL);
// hwnd를 이용한 추가 작업 가능
}
};
지금 현재의 나는 ? class를 사용하는 방법에 대해서 한번 더 명확하게 정리할 필요가 있다.
흐름은 이해했으나, 프로그래밍을 직접적으로 선언하는 방법에 대해서는 조금 더 친해질 필요가 있다.
예제로 얻은 내용에 대해서 직접 해석해보면서, 어떻게 프로그래밍 할 지 고민해봐야겠다.
//CShader.h 헤더파일
#pragma once
#include <windows.h>
class CShader {
public:
void InitializeWindow();
};
//CShader.cpp 클래스 구현 파일
#include "CShader.h"
void CShader::InitializeWindow() {
HWND hwnd = CreateWindow(
L"STATIC", L"Example Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
NULL, NULL, GetModuleHandle(NULL), NULL);
// hwnd를 이용한 추가 작업 가능
}
//main.cpp 진입점 파일
#include <windows.h>
#include "CShader.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
CShader shader;
shader.InitializeWindow();
// 메시지 루프 등 일반적인 윈도우 프로그램 로직 추가
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}