이번 포스팅에서는 조금은 생소하지만 스트링을 사용함에 있어서 편리함을 제공해 주는 로 스트링 리터럴에 대해서 정리했습니다.
인용구 사용
문자열 안에 인용구 같은 또 다른 문자열을 넣고 싶어서 다음과 같이 작성한다면 바로 컴파일 에러가 발생할 것입니다.
const char* str = "나폴레옹은 "1퍼센트의 가능성, 그것이 나의 길이다!"라는 명언을 남겼습니다.";
보통 위의 경우 이스케이프 시퀀스 \" 을 사용하여 다음과 같이 표현합니다.
const char* str = "나폴레옹은 \"1퍼센트의 가능성, 그것이 나의 길이다!\"라는 명언을 남겼습니다.";
하지만 이스케이프 시퀀스를 사용하지 않고 다음과 같이 표현되는 로 스트링 리터럴을 사용하면 가독성을 높일 수 있습니다. 로 스트링 리터럴은 R"(문자열)"로 표현합니다.
const char* str = R"(나폴레옹은 "1퍼센트의 가능성, 그것이 나의 길이다!"라는 명언을 남겼습니다.)";
줄 바꿈
로 스트링 리터럴을 사용하지 않고 여러 줄에 걸친 스트링을 표현하려면 다음과 같이 스트링 안에 \n을 넣어 표현합니다.
const char* str = "안녕하세요.\n반갑습니다.";
결과
안녕하세요.
반갑습니다.
하지만 로 스트링 리터럴을 사용하면 이스케이프 시퀀스를 사용하지 않고 그냥 엔터만 누르면 줄 바꿈이 됩니다.
const char* str = R"(안녕하세요.
반갑습니다.)";
결과
안녕하세요.
반갑습니다.
내부 이스케이프 시퀀스 사용
로 스트링 리터럴 안에서는 사용되는 이스케이프 시퀀스를 무시합니다. 예를 들어 탭문자를 나타내는 \t 이스케이프 시퀀스를 사용하면 그냥 문자로 인식되어 \t가 그대로 출력됩니다.
const char* str = R"(이것은 탭문자입니까? \t)";
결과
이것은 탭문자입니까? \t
확장 로 스트링 리터럴(extended raw string literal)
로 스트링 리터럴은 그 안에 )"을 넣을 수 없습니다. 이유는 로 스트링 리터럴이 )"로 끝나기 때문입니다. 만약 다음과 같이 표현한다면 컴파일 에러가 발생합니다.
const char* str = R"(질문)" 이것은 탭문자입니까?)"; //컴파일 에러
위 문장을 에러 없이 표현하려면 다음과 같이 확장 로 스트링 리터럴로 표현해야 합니다.
R"d-char-sequence(r-char-sequence)d-char-sequence"
r-char-sequence 부분이 실제 로 스트링이고 좌/우의 d-char-sequence는 구분자 시퀀스로 반드시 로 스트링 리터럴의 시작과 끝에 똑같이 나와야 합니다.
구분자 시퀀스는 최대 16개의 문자를 가질 수 있으며, 로 스트링 리터럴 안에 나오지 않는 값으로 지정해야 합니다.
const char* str1 = R"&(질문) 이것은 "(탭문자)"입니까?)&";
const char* str2 = R"aa(질문) 이것은 "(탭문자)"입니까?)aa";
결과
질문) 이것은 "(탭문자)"입니까?
질문) 이것은 "(탭문자)"입니까?
[참고]
1. 전문가를 위한 c++(개정4판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
'Program Language > c++' 카테고리의 다른 글
C++ 기초(std::string_view 클래스) (10) | 2023.03.03 |
---|---|
C++ 기초(std::string 클래스) (7) | 2023.03.02 |
C++ 기초(직원 관리 시스템 - 사용자 인터페이스) (10) | 2023.02.13 |
C++ 기초(직원 관리 시스템 - Database 클래스) (19) | 2023.02.09 |
C++ 기초(직원 관리 시스템 - 단위 테스트) (38) | 2023.02.07 |
댓글