문자열 리터럴
문자열 리터럴 (String literals)
문자열 리터럴은 일련의 문자를 이어 붙여 얻는 문자열 상수(string constant)를 표현해요. Go에서는 문자열 리터럴을 쓰는 형식이 두 가지가 있는데, 바로 raw string literal과 interpreted string literal이에요.
출처: Go Specification
본문
Raw string literal — 백쿼트 사이를 있는 그대로
우선 raw string literal부터 볼게요. 이 형식은 백쿼트(back quote, `) 사이에 문자를 나열하는 거예요. 예를 들어 `foo`처럼요. 백쿼트 안에는 백쿼트만 빼고 어떤 문자든 올 수 있어요. 이 리터럴의 값은 따옴표 사이의 문자를 있는 그대로, 그러니까 해석하지 않고(묵시적으로 UTF-8로 인코딩된) 이어 붙인 문자열이 돼요. 특히 백슬래시가 아무 특별한 의미도 갖지 않고, 문자열 안에 새 줄(newline)이 그대로 들어올 수 있어요. 참고로 raw string literal 안의 캐리지 리턴 문자('\r')는 raw 문자열 값에서 버려져요.
Interpreted string literal — 이스케이프를 해석
다음은 interpreted string literal이에요. 큰따옴표(double quote) 사이에 문자를 나열하는 형식이고, "bar"처럼 생겼죠. 큰따옴표 안에는 새 줄과 이스케이프되지 않은 큰따옴표만 빼고 어떤 문자든 올 수 있어요. 따옴표 사이의 텍스트가 리터럴의 값이 되는데, 백슬래시 이스케이프는 rune literal에서 해석되는 것과 같은 방식으로 해석돼요(\'가 불법이고 \"가 합법이라는 점만 빼고요), 같은 제약도 함께 따라가요.
세 자리 8진수(\nnn)와 두 자리 16진수(\xnn) 이스케이프는 결과 문자열의 개별 바이트(byte) 를 나타내고, 그 밖의 모든 이스케이프는 개별 문자(character) 의 (여러 바이트일 수 있는) UTF-8 인코딩을 나타내요. 그래서 문자열 리터럴 안에서 \377과 \xFF는 값 0xFF=255인 단일 바이트를 나타내지만, ÿ, \u00FF, \U000000FF, \xc3\xbf는 문자 U+00FF의 UTF-8 인코딩인 두 바이트 0xc3 0xbf를 나타내요.
형식은 문법(grammar)으로 이렇게 정의돼 있어요.
string_lit = raw_string_lit | interpreted_string_lit .
raw_string_lit = "`" { unicode_char | newline } "`" .
interpreted_string_lit = `"` { unicode_value | byte_value } `"` .
어떤 문자들이 실제로 문자열 리터럴을 이룰 수 있는지 예로 확인해 볼게요.
`abc` // same as "abc"
`\n
\n` // same as "\\n\n\\n"
"\n"
"\"" // same as `"`
"Hello, world!\n"
"日本語"
"\u65e5本\U00008a9e"
"\xff\u00FF"
"\uD800" // illegal: surrogate half
"\U00110000" // illegal: invalid Unicode code point
여기 아래 예시들은 전부 같은 문자열을 나타내요.
"日本語" // UTF-8 input text
`日本語` // UTF-8 input text as a raw literal
"\u65e5\u672c\u8a9e" // the explicit Unicode code points
"\U000065e5\U0000672c\U00008a9e" // the explicit Unicode code points
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" // the explicit UTF-8 bytes
한 가지 주의할 점이 있어요. 소스 코드가 문자 하나를 두 개의 코드 포인트로 표현할 때, 예를 들어 악센트와 글자가 결합된 결합 문자 형태(combining form)라면, 이걸 rune literal에 넣으면 오류가 돼요. 단일 코드 포인트가 아니기 때문이에요. 반면 string literal에 넣으면 두 개의 코드 포인트로 그대로 나타나요.
더 알아보기
- 이스케이프 해석 방식이 궁금하다면 Go 스펙의 Rune literals 섹션을 함께 보면 좋아요.
- 문자열 상수에 대한 더 자세한 내용은 Constants 섹션에서 다뤄요.
- 문자 집합과 코드 포인트 개념은 Source code representation 섹션에서 확인할 수 있어요.