본문 바로가기

C++/C, C++, STL

문자열 및 문자 리터럴

문자 리터럴(Chacter literals)

문자 리터럴은 상수 문자로 구성됩니다. 상수 문자는 작은 따옴표 '로 둘러싸인 문자입니다.

문자 리터럴 유형은 다음 5가지로 구분됩니다.

구분 예시 지원 버전
char 타입 문자 리터럴 'a' '1' ' ' 모든 버전에서 지원
UTF-8의 char8_t 타입 문자 리터럴 u8'a' u8'1' u8' ' C++ 20
UTF-16의 char16_t 타입 문자 리터럴 u'a' u'1' u' ' C++ 11
UTF-32의 char32_t 타입 문자 리터럴 U'a' U'1' U' ' C++ 11
와이드 문자의 wchar_t 타입 문자 리터럴 L'a' L'1' L' ' 모든 버전에서 지원
더보기

문자 리터럴에서는 예약어에 해당하는 백슬래시 \ 작은 따옴표 ' 개행 등을 사용 할 수 없습니다.

예약어를 문자 리터럴에서 사용하려면 이스케이프 시퀀스 \를 사용합니다.

구분 이스케이스 시퀀스
null 문자 \0
줄 바꿈 \n
백슬래시 \\
가로 탭 \t
물음표 ? 또는 \?
작은 따옴표 \'
큰 따옴표 \"
백스페이스 \b

인코딩(Encoding)

문자 리터럴은 접두사를 기반으로 인코딩 유형이 결정됩니다.

인코딩 유형 데이터 타입 비고 예시
일반 문자 리터럴 char 접두사 없는 문자 리터럴입니다. 'a' '1' ' '
UTF-8 문자 리터럴 char8_t 접두사 u8로 시작하는 문자 리터럴입니다. u8'a' u8'1' u8' '
UTF-16 문자 리터럴 char16_t 접두사 u로 시작하는 문자 리터럴입니다. u'a' u'1' u' '
UTF-32 문자 리터럴 char32_t 접두사 U로 시작하는 문자 리터럴입니다. U'a' U'1' U' '
와이드 문자 리터럴 wchar_t 접두사 L로 시작하는 문자 리터럴입니다. L'a' L'1' L' '

다중 문자(Multicharacter) 리터럴

다중 문자 리터럴을 만들기 위해서 컴파일러는 문자 시퀀스를 32비트 integer 타입에서 각각의 문자를 8비트 값으로 변환합니다.

리터럴의 여러 문자는 경우에 따라서 상위에서 하위로 바이트를 채우게 됩니다. 그런 다음 컴파일러는 일반적인 규칙에 따라서 정수를 대상 타입으로 변환합니다.

더보기

C++에서 작은 따옴표 사이의 문자는 문자 리터럴입니다. 다중 문자 리터럴은 작은 따옴표 사이에 문자 시퀀스가 포함된 경우, 예를 들어 char c = 'abcd'와 같은 형태를 의미합니다.

일반 문자 리터럴은 char 타입으로 표현되며 다중 문자 리터럴은 int 타입으로 표현됩니다.

예를 들어 char wchar_t 또는 char16_t와 같은 다중 문자 리터럴을 생성하는 과정에서 컴파일러는 하위 문자부터 바이트를 채우며 문자가 잘리는 경우 경고합니다.

char i = 'abcd';        // C4305, C4309, truncates to 'd'
wchar_t j = 'abcd';     // C4305, C4309, truncates to '\x6364'
int k = 'abcd';         // 0x61626364
더보기

3자리 이상의 숫자를 포함하는 것처럼 보이는 8진수 이스케이프 시퀀스는 3자리 8진수 시퀀스로 처리됩니다.

따라서 후속 문자 리터럴이 우선 채워지기 때문에 다음과 같은 결과를 가집니다.

char i = '\100';        // '@'
char j = '\1000';       // C4305, C4309, truncates to '0'

문자열 리터럴

문자열 리터럴null로 끝나는 문자열을 형성하는 문자 시퀀스입니다.

다중 문자 리터럴이 아닌 문자열 리터럴을 표현하려면 큰 따옴표 "로 문자 시퀀스를 묶어서 사용합니다.

// Before C++ 20
const char* i = u8"Hello World!";

// C++20 and later
const char8_t* j = u8"Hello World!";

예를 들어 UTF-8로 인코딩된 문자열은 u8 접두사로 구분된 const char[n] 배열입니다. 여기서 n은 인코딩된 배열의 길이입니다.

C++ 20부터는 char8_t 타입이 도입되어 접두사 u8을 대신 할 수 있습니다.

const wchar_t* s = L"Hello!";
const size_t size = (wcslen(s) + 1) * sizeof(wchar_t);

std::cout << "size of wchar_t is " << sizeof(wchar_t) << std::endl;  // size of wchar_t is 2
std::cout << "length of s is " << wcslen(s) << std::endl;            // length of s is 6
std::cout << "size of s is " << size << std::endl;                   // size of s is 14

ANS char* 문자열 및 기타 단일 바이트 인코딩(UTF-8 제외)의 경우 문자열 리터럴의 크기는 null을 포함합니다.

std::string 리터럴

std::string 리터럴은 표준 라이브러리의 구현으로 C++ 14부터 사용 할 수 있습니다.

#include <string>

using namespace std::string_literals;

int main()
{
    std::string s{ "Helleo World"s };
    std::string u8si{ u8"Hello World" };        // Before C++ 20
    std::u8string u8sj{ u8"Hello World" };      // C++ 20 and later
    std::wstring ws{ L"Hello World" };
    std::u16string u16s{ u"Hello World" };
    std::u32string u32s{ U"Hello World" };
}

std::string 리터럴은 s 접미사를 포함합니다. 해당 접미사를 포함하지 않는 경우 접두사의 형식에 따라서 인코딩 타입의 데이터 타입을 지정합니다.