C++ 문자 리터럴과 문자열 리터럴의 차이점
C++에서 작은따옴표(' ')와 큰따옴표(" ")는 전혀 다른 의미를 가집니다. 두 표기법은 겉보기에 비슷해 보이지만, 데이터 타입과 메모리 구조, 동작 방식까지 모두 다르기 때문에 그 차이를 정확히 이해하는 것이 중요합니다.
작은따옴표: 문자 리터럴(Character Literal)
작은따옴표로 감싼 하나의 문자는 문자 리터럴이며, 타입은 char입니다. 예를 들어 'a'는 ASCII 기반 시스템에서 정숫값 97을 가지는 char 타입입니다.
char c = 'a'; // char 타입, ASCII 값 97큰따옴표: 문자열 리터럴(String Literal)
반면 큰따옴표로 감싼 하나 이상의 문자 집합은 문자열 리터럴입니다. 문자열 리터럴의 타입은 const char[]이며, 실제로는 문자열 길이 + 1 크기의 배열을 참조합니다. 여기서 추가되는 마지막 한 글자는 문자열의 끝을 알려주는 널 종단 문자(\0, NULL)입니다.
const char* s = "abc"; // 크기 4짜리 배열: 'a', 'b', 'c', '\0'길이와 출력 방식의 차이
문자열 리터럴은 "abcdefg"처럼 필요에 따라 임의로 길게 작성할 수 있습니다. 반면 문자 리터럴은 거의 항상 단일 문자만 담습니다.
출력 시에도 동작 방식이 다릅니다. 문자열 리터럴은 문자열 내부에서 첫 번째 \0(NULL) 문자를 만날 때까지만 출력됩니다. 즉, 널 종단 문자가 문자열의 경계를 결정하는 역할을 하므로, 이 문자가 누락되면 예기치 않은 동작이나 메모리 접근 오류가 발생할 수 있습니다.
정리
- 'a' → char 타입의 문자 리터럴 (ASCII 기준 값 97)
- "a" → const char[] 타입의 문자열 리터럴 ('a'와 '\0' 두 요소를 가진 배열)
- 문자열 리터럴은 길이 제한 없이 사용 가능하며, NULL 문자를 만나면 출력이 종료됨