728x90
C++ 메모리 영역 개요
- 스택(Stack)
- 함수 호출 시 생성되는 지역 변수, 매개변수 등이 저장되는 영역
- 데이터 영역(Data Segment)
- 초기화된 전역 변수와 정적 변수 등이 위치
- 힙(Heap)
- new/delete 또는 malloc/free로 동적 할당한 메모리가 위치
- 코드 영역(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] 등으로 저장)
- 동작 원리:
- strNum[i]에는 10진수 ASCII 코드가 저장됨
- 출력 시 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 |