루리코딩 세상

Windows.h 식별자(identifier)란? 그리고, windows.h 에서 활용 본문

이론/windows.API

Windows.h 식별자(identifier)란? 그리고, windows.h 에서 활용

루리딩 2025. 6. 10. 16:41

식별자( 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;
}