본문 바로가기
C++/유튜브 어소트락 게임아카데미 C++무료강의

12. 문자

by GREEN나무 2025. 4. 28.
728x90

 

C++ 메모리 영역 개요

  1. 스택(Stack)
    • 함수 호출 시 생성되는 지역 변수, 매개변수 등이 저장되는 영역
  2. 데이터 영역(Data Segment)
    • 초기화된 전역 변수와 정적 변수 등이 위치
  3. 힙(Heap)
    • new/delete 또는 malloc/free로 동적 할당한 메모리가 위치
  4. 코드 영역(ROM)
    • 실행할 기계어 코드가 저장된 읽기 전용 메모리(Read Only Memory)

C++ 문자 관련 기본형

자료형 크기 설명
char 1 byte 정수 타입. 저장된 값에 대응하는 문자로 출력
bool 1 byte 0 또는 1. 0이 아니면 모두 참(true)
wchar_t 2 byte 와이드 문자. 유니코드 문자 저장 가능
short 2 byte 부호 있는 16비트 정수
  • char c = 0;
    저장된 값 0에 대응하는 제어 문자(NULL)를 의미
  • char c = '1';
    메모리에 10진수 49(ASCII 코드)가 저장되어, 화면에 '1'로 출력
#include <iostream>

int main() {
    // 숫자로 저장된 문자 값
    char cNum = 1;
    std::cout << "cNum (숫자 1) 출력 시: [" << cNum << "]" << std::endl;
    std::cout << "cNum 정수 값: " << static_cast<int>(cNum) << std::endl;

    // 문자로 저장된 '1'
    char cChar = '1';
    std::cout << "cChar ('1') 출력 시: [" << cChar << "]" << std::endl;
    std::cout << "cChar 정수 값: " << static_cast<int>(cChar) << std::endl;

    // 와이드 문자 예시
    wchar_t wc = L'A';
    std::wcout << L"wc (L'A') 출력 시: [" << wc << L"]" << std::endl;
    std::wcout << L"wc 정수 값: " << static_cast<int>(wc) << std::endl;

    return 0;
}

숫자와 문자 저장 방식 차이

메모리에 저장된 1(숫자)과 '1'(문자)은 완전히 다른 값

 - 숫자로 저장

    char cNum = 1; // 0x01이 저장됨 (제어문자 SOH)

- 문자로 저장

    char cChar = '1'; // 10진수 49 (0x31)이 저장됨

 

※ ASCII 코드에서 SOH(Start of Heading)는 10진수 1, 16진수 0x01에 해당.

   전송 제어 문자로 메시지 헤더의 시작 표시 등에 사용

 


문자열 끝을 알리는 Null 문자

C 스타일 문자열은 마지막에 '\0'(Null, 0)을 넣어야 끝을 감지

"AB cd"를 메모리에 저장할 때
'A' → 65  
'B' → 66  
' ' → 32  
'c' → 99  
'd' → 100  
'\0' → 0

문자 저장 예시 코드

 

#include <iostream>
#include <vector>

int main() {
    // 1) 문자로 저장: C 스타일 문자열 (널 종료)
    char strChar[] = "AB cd";  // 자동으로 마지막에 '\0'이 추가됨
    std::cout << "문자 저장: " << strChar << std::endl;

    // 2) 숫자로 저장: ASCII 코드 배열
    // 끝 표시용으로 0을 마지막에 넣어주거나, 길이를 따로 관리할 수 있음
    int strNum[] = { 65, 66, 32, 99, 100, 0 };  
    std::cout << "숫자 저장: ";
    for (int i = 0; strNum[i] != 0; ++i) {
        std::cout << static_cast<char>(strNum[i]);
    }
    std::cout << std::endl;

    // 3) 문자 저장: std::string 사용 예
    std::string s = "AB cd";
    std::cout << "std::string 저장: " << s << std::endl;

    // 4) 숫자로 저장: std::vector<int> 사용 예
    std::vector<int> v = { 65, 66, 32, 99, 100 };
    std::cout << "벡터에 숫자 저장: ";
    for (int code : v) {
        std::cout << static_cast<char>(code);
    }
    std::cout << std::endl;

    return 0;
}

 

위 코드가 메모리에서 어떻게 구성되고 동작하는지 단계별로 설명합니다.


1) char strChar[] = "AB cd";

  • 메모리 할당 위치: 스택
  • 배열 크기: 컴파일 시 "AB cd"의 문자 수(5) + 종료용 '\0'(1) = 6바이트
  • 메모리 모습 (각 바이트에 저장된 10진수 값):
  • [65]['A'] → [66]['B'] → [32][' '] → [99]['c'] → [100]['d'] → [0]['\0']
  • 동작 원리: 배열의 각 원소가 인덱스 순서대로 ASCII 코드 값을 저장하며, 맨 끝의 0은 문자열의 종료를 알리는 널(NUL) 문자입니다 (Null-terminated string - Wikipedia).

2) int strNum[] = { 65, 66, 32, 99, 100, 0 };

  • 메모리 할당 위치: 스택
  • 배열 크기: 6개의 int (보통 4바이트씩 총 24바이트)
  • 메모리 모습 (바이트 단위로 보면 각 int는 리틀 엔디언 시스템 기준으로 [0x41,0x00,0x00,0x00] 등으로 저장)
  • 동작 원리:
    1. strNum[i]에는 10진수 ASCII 코드가 저장됨
    2. 출력 시 static_cast<char>(strNum[i])로 문자 형태로 변환하여 화면에 표시

3) std::string s = "AB cd";

  • 메모리 할당 위치:
    • 스택에 std::string 객체(헤더)
    • 힙에 실제 문자열 버퍼 (문자 + 널 종료)
  • 동작 원리: 내부적으로 char 배열을 동적 할당하고 널 종료 문자를 포함해 복사
  • 장점: 길이를 자동 관리, 안전한 메모리 관리

4) std::vector<int> v = { 65, 66, 32, 99, 100 };

  • 메모리 할당 위치:
    • 스택에 vector 객체
    • 힙에 정수 배열
  • 동작 원리: push_back과 유사하게 각 요소를 힙에 이어서 저장. 널 종료는 없음.
  • 출력: 각 요소를 char로 형변환해 문자로 출력

추가 설명: ASCII 코드

  • ASCII는 128개 코드 포인트로 문자를 숫자(0–127)로 매핑하는 표준입니다 (ASCII - Wikipedia).
  • 코드값 하나가 **1바이트(8비트)**에 저장되며, 컴퓨터는 이 값을 읽어 대응하는 문자 이미지를 화면에 그립니다.

이처럼 C 스타일 문자열(char[])은 메모리 연속 영역에 문자 코드와 널 종료 문자를 저장함으로써 끝을 알리고, 숫자 배열(int[])은 각 원소에 문자 코드만 저장해 필요 시 캐스팅해서 사용합니다.


주요 ASCII 코드 구간

10진법  대응하는 값 설명
0 null 문자열 끝 표시, 제어 문자
32 SP 공백(스페이스바)
32–47 특수문자 !"#$%&'()*+,-./
48–57 숫자문자 '0'–'9'
58–64 연산·기호 :;<=>?@
65–90 대문자 'A'–'Z'
91–96 기호 `[]^_``
97–122 소문자 'a'–'z'
123–126 기호 `{
127 DEL 삭제 제어 문자

 

'C++ > 유튜브 어소트락 게임아카데미 C++무료강의' 카테고리의 다른 글

11. void 포인터 (void*)  (0) 2025.04.19
10. 포인터와 const  (0) 2025.04.19
9. 포인터 변수 문제 풀이  (0) 2025.04.15
8. 포인터  (0) 2025.04.15
7. 지역변수, 전역변수  (0) 2025.04.02