λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

μ›ν•˜λŠ” μ’Œν‘œλ‘œ μ»€μ„œ μ΄λ™ν•˜κΈ° (SetConsoleCursorPosition)

by 5566 2023. 8. 16.

1. μ†Œκ°œ

μ»€μ„œ(Cursor)λŠ” 컴퓨터 ν™”λ©΄μ—μ„œ ν˜„μž¬ μž…λ ₯ λ˜λŠ” 좜λ ₯ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μž‘μ€ ν‘œμ‹μž…λ‹ˆλ‹€. μ›ν•˜λŠ” μ’Œν‘œλ‘œ μ»€μ„œλ₯Ό μ΄λ™ν•˜λŠ” 것은 ν…μŠ€νŠΈ 기반 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 맀우 μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ»€μ„œ 이동을 κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” ν•¨μˆ˜ 쀑 ν•˜λ‚˜κ°€ SetConsoleCursorPosition μž…λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›ν•˜λŠ” μ’Œν‘œλ‘œ μ»€μ„œλ₯Ό μ΄λ™ν•˜λŠ” 방법에 λŒ€ν•΄ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€. SetConsoleCursorPosition ν•¨μˆ˜λŠ” Windows 운영 μ²΄μ œμ—μ„œ μ œκ³΅λ˜λŠ” ν•¨μˆ˜λ‘œ, C++ λ“±μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»€μ„œλ₯Ό μ‘°μž‘ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. κ³„μ†ν•΄μ„œ SetConsoleCursorPosition ν•¨μˆ˜μ˜ κ°œμš”μ™€ μ‚¬μš©λ²•, 그리고 μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ»€μ„œ 이동을 톡해 효율적인 ν…μŠ€νŠΈ 기반 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.

2. μ»€μ„œ μ΄λ™μ˜ μ€‘μš”μ„±

μ»€μ„œ 이동은 ν…μŠ€νŠΈ 기반 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 맀우 μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. 특히 ν…μŠ€νŠΈ 기반 κ²Œμž„, ν…μŠ€νŠΈ νŽΈμ§‘κΈ°, μ½˜μ†” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ“±μ—μ„œ μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš©μ„ μœ„ν•΄ ν•„μˆ˜μ μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

μ»€μ„œ 이동을 톡해 μ‚¬μš©μžλŠ” μ›ν•˜λŠ” μœ„μΉ˜μ— ν…μŠ€νŠΈλ₯Ό μž…λ ₯ν•˜κ±°λ‚˜ 확인할 수 있고, ν”„λ‘œκ·Έλž¨μ—μ„œλ„ ν•„μš”ν•œ 정보λ₯Ό νŠΉμ • μœ„μΉ˜μ— 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»€μ„œ 이동은 νŽΈμ§‘ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλ„ μ€‘μš”ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν…μŠ€νŠΈλ₯Ό νŠΉμ • μœ„μΉ˜λ‘œ λ³΅μ‚¬ν•˜κ³ μž ν•  λ•ŒλŠ” 원본 μœ„μΉ˜μ—μ„œ μž‘μ—…ν•œ λ’€, 볡사할 μœ„μΉ˜λ‘œ μ»€μ„œλ₯Ό μ΄λ™μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€.

λ˜ν•œ, ν…μŠ€νŠΈ 기반 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” 가독성과 μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒν•˜κΈ° μœ„ν•΄ ν…μŠ€νŠΈλ₯Ό μ§€μ •λœ μœ„μΉ˜μ— λ°°μΉ˜ν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€. 이λ₯Όμœ„ν•΄ μ»€μ„œ 이동은 ν•„μˆ˜μ μΈ λ„κ΅¬μž…λ‹ˆλ‹€.

λ”°λΌμ„œ, μ»€μ„œ 이동은 ν…μŠ€νŠΈ 기반 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 효율적인 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»€μ„œλ₯Ό μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚€λŠ” 방법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

3. SetConsoleCursorPosition ν•¨μˆ˜ κ°œμš”

SetConsoleCursorPositionλŠ” Windows 운영 μ²΄μ œμ—μ„œ μ œκ³΅λ˜λŠ” ν•¨μˆ˜λ‘œ, μ»€μ„œλ₯Ό μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” "windows.h" 헀더 파일 μ•ˆμ— μ •μ˜λ˜μ–΄ 있고, Windows APIλ₯Ό 톡해 ν˜ΈμΆœλ©λ‹ˆλ‹€.

ν•¨μˆ˜μ˜ μ›ν˜•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

BOOL SetConsoleCursorPosition(
  HANDLE hConsoleOutput,
  COORD  dwCursorPosition
);
  • hConsoleOutput: μ»€μ„œλ₯Ό μ΄λ™μ‹œν‚¬ μ½˜μ†” 창의 ν•Έλ“€μž…λ‹ˆλ‹€.
  • dwCursorPosition: 이동할 μ»€μ„œμ˜ μ’Œν‘œλ₯Ό μ§€μ •ν•˜λŠ” COORD κ΅¬μ‘°μ²΄μž…λ‹ˆλ‹€.

SetConsoleCursorPosition ν•¨μˆ˜λŠ” μ»€μ„œλ₯Ό μ§€μ •λœ ν•Έλ“€μ˜ μ½˜μ†” 창으둜 μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. μ΄λ•Œ, μ’Œν‘œλŠ” COORD ꡬ쑰체λ₯Ό μ‚¬μš©ν•˜μ—¬ x와 y κ°’μœΌλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. λ”°λΌμ„œ, μ»€μ„œλ₯Ό μ΄λ™μ‹œν‚¬ μœ„μΉ˜μ˜ x와 y μ’Œν‘œλ₯Ό COORD ꡬ쑰체에 μ„€μ •ν•œ λ‹€μŒ, 이λ₯Ό ν•¨μˆ˜μ˜ 두 번째 인자둜 μ „λ‹¬ν•©λ‹ˆλ‹€.

ν•¨μˆ˜λŠ” μ»€μ„œ 이동에 μ„±κ³΅ν•˜λ©΄ TRUEλ₯Ό λ°˜ν™˜ν•˜κ³ , μ‹€νŒ¨ν•˜λ©΄ FALSEλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μ»€μ„œ 이동에 μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” 예λ₯Ό λ“€μ–΄ 잘λͺ»λœ 핸듀이 μ „λ‹¬λ˜μ—ˆμ„ λ•Œ 등이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»€μ„œλ₯Ό μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™ν•˜λŠ” 방법에 λŒ€ν•΄ λ‹€μŒ μ„Ήμ…˜μ—μ„œ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

4. SetConsoleCursorPosition ν•¨μˆ˜μ˜ μ‚¬μš©λ²•

SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»€μ„œλ₯Ό μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚€λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. λ¨Όμ €, μ»€μ„œλ₯Ό μ΄λ™μ‹œν‚¬ μ½˜μ†” 창의 핸듀을 μ–»μ–΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ CreateFile ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ½˜μ†” 창의 핸듀을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
HANDLE hConsoleOutput = CreateFile("CONOUT$", GENERIC_WRITE | GENERIC_READ,
                                  FILE_SHARE_READ | FILE_SHARE_WRITE,
                                  NULL, OPEN_EXISTING, 0, NULL);
  1. 이제 μ»€μ„œλ₯Ό 이동할 μœ„μΉ˜μ˜ μ’Œν‘œλ₯Ό μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ’Œν‘œλŠ” COORD ꡬ쑰체λ₯Ό μ‚¬μš©ν•˜μ—¬ x와 y κ°’μœΌλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 μ’Œν‘œλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
COORD dwCursorPosition;
dwCursorPosition.X = 10; // x μ’Œν‘œ
dwCursorPosition.Y = 5;  // y μ’Œν‘œ
  1. λ§ˆμ§€λ§‰μœΌλ‘œ, SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ»€μ„œλ₯Ό μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. ν•Έλ“€κ³Ό μ’Œν‘œλ₯Ό 인자둜 μ „λ‹¬ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
BOOL success = SetConsoleCursorPosition(hConsoleOutput, dwCursorPosition);
  1. ν•¨μˆ˜κ°€ μ„±κ³΅μ μœΌλ‘œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ λ°˜ν™˜ 값을 ν™•μΈν•©λ‹ˆλ‹€. λ°˜ν™˜ 값이 TRUE인 경우 μ»€μ„œ 이동에 μ„±κ³΅ν•œ κ²ƒμž…λ‹ˆλ‹€.

μ»€μ„œμ˜ μœ„μΉ˜λ₯Ό μ΄λ™μ‹œν‚€λ©΄ ν…μŠ€νŠΈλ₯Ό μ§€μ •λœ μœ„μΉ˜μ— μž…λ ₯ν•˜κ±°λ‚˜ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ΄λ™λœ μ»€μ„œ μœ„μΉ˜μ—μ„œ ν…μŠ€νŠΈλ₯Ό λ³΅μ‚¬ν•˜κ±°λ‚˜ μ‚­μ œν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이처럼 SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ ν…μŠ€νŠΈ 기반 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 효율적인 μ»€μ„œ 이동을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. SetConsoleCursorPosition ν•¨μˆ˜μ˜ μ˜ˆμ‹œ

λ‹€μŒμ€ SetConsoleCursorPosition ν•¨μˆ˜μ˜ μ˜ˆμ‹œ μ½”λ“œμž…λ‹ˆλ‹€. 이 μ˜ˆμ‹œλŠ” μ»€μ„œλ₯Ό μ΄λ™μ‹œμΌœ μ›ν•˜λŠ” μœ„μΉ˜μ— ν…μŠ€νŠΈλ₯Ό 좜λ ₯ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€:

#include <iostream>
#include <Windows.h>

int main() {
    // μ»€μ„œλ₯Ό 이동할 μ½˜μ†” 창의 핸듀을 μ–»μ–΄μ˜΅λ‹ˆλ‹€
    HANDLE hConsoleOutput = CreateFile("CONOUT$", GENERIC_WRITE | GENERIC_READ,
                                       FILE_SHARE_READ | FILE_SHARE_WRITE,
                                       NULL, OPEN_EXISTING, 0, NULL);

    if (hConsoleOutput == INVALID_HANDLE_VALUE) {
        std::cout << "Failed to get console handle." << std::endl;
        return 1;
    }

    // μ»€μ„œλ₯Ό 이동할 μœ„μΉ˜ μ’Œν‘œλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€
    COORD dwCursorPosition;
    dwCursorPosition.X = 10; // x μ’Œν‘œ
    dwCursorPosition.Y = 5;  // y μ’Œν‘œ

    // μ»€μ„œλ₯Ό μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€
    BOOL success = SetConsoleCursorPosition(hConsoleOutput, dwCursorPosition);

    if (!success) {
        std::cout << "Failed to set console cursor position." << std::endl;
        CloseHandle(hConsoleOutput);
        return 1;
    }

    // μ΄λ™λœ μ»€μ„œ μœ„μΉ˜μ—μ„œ ν…μŠ€νŠΈλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€
    std::cout << "Hello, World!" << std::endl;

    // 핸듀을 λ‹«κ³  ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€
    CloseHandle(hConsoleOutput);
    return 0;
}

μœ„μ˜ μ½”λ“œμ—μ„œλŠ” λ¨Όμ € CreateFile ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ½˜μ†” 창의 핸듀을 μ–»μ–΄μ˜€κ³ , 이 핸듀을 μ΄μš©ν•˜μ—¬ SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ»€μ„œλ₯Ό μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. μ΄ν›„μ—λŠ” μ΄λ™λœ μ»€μ„œ μœ„μΉ˜μ—μ„œ ν…μŠ€νŠΈ "Hello, World!"λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ»€μ„œκ°€ μ§€μ •λœ μœ„μΉ˜λ‘œ μ΄λ™ν•˜μ—¬ "Hello, World!"κ°€ ν•΄λ‹Ή μœ„μΉ˜μ— 좜λ ₯λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이와 같이 SetConsoleCursorPosition ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ ν…μŠ€νŠΈ 기반 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ›ν•˜λŠ” μœ„μΉ˜μ— ν…μŠ€νŠΈλ₯Ό 좜λ ₯ν•˜λŠ” λ“±μ˜ λ‹€μ–‘ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€