문자
문자 (Characters)
프로그램을 짜기 전에, Go가 소스 코드를 이루는 가장 작은 단위인 문자(character)를 어떻게 바라보는지부터 잡고 갈게요. Go는 모든 소스가 UTF-8 인코딩된 유니코드로 처리돼요. 그래서 이번 절에서 등장하는 newline, unicode_char, unicode_letter, unicode_digit 같은 용어들은 곧바로 뒤에 나올 Identifier(식별자)나 리터럴 문법을 정의하는 데 그대로 쓰이니, 여기서 의미만 확실히 짚어 두면 좋아요.
출처: Go Specification
본문
다음 용어들은 특정 유니코드 문자 범주를 가리킬 때 쓰여요:
newline = /* the Unicode code point U+000A */ .
unicode_char = /* an arbitrary Unicode code point except newline */ .
unicode_letter = /* a Unicode code point categorized as "Letter" */ .
unicode_digit = /* a Unicode code point categorized as "Number, decimal digit" */ .
이 EBNF 정의를 하나씩 풀어볼게요. newline은 유니코드 코드 포인트 U+000A, 즉 우리가 아는 줄바꿈 문자가 딱 하나예요. unicode_char는 줄바꿈을 제외한 임의의 유니코드 코드 포인트를 뜻하고요. 그리고 unicode_letter와 unicode_digit가 조금 더 흥미로운데, 뒤에서 설명드릴 식별자의 핵심 재료가 되거든요.
The Unicode Standard 8.0의 4.5절 "General Category"는 문자 범주들의 집합을 정의해요. Go는 이 범주 중 Letter에 해당하는 Lu, Ll, Lt, Lm, Lo 중 어느 하나에 속한 문자를 전부 유니코드 글자(Unicode letter)로 취급하고, Number 범주의 Nd에 속한 문자를 유니코드 숫자(Unicode digit)로 취급해요.
여기서 눈여겨볼 점은 범주가 영어 알파벳 하나로만 정해지는 게 아니라는 거예요. 예를 들어 _(밑줄)은 Letter 범주에 속하지 않아서 unicode_letter가 아니지만, 뒤에서 보게 될 식별자 규칙이 _를 별도로 허용해요. 다시 말해 "문자가 Unicode letter인지"와 "식별자에 쓸 수 있는지"는 구분해서 봐야 해요. 지금은 unicode_letter가 "Letter 범주에 속한 문자"를 가리키는 용어라는 것만 정확히 알아 두시면 됩니다.
더 알아보기
- The Unicode Standard 8.0 4.5절 "General Category" — Lu, Ll, Lt, Lm, Lo, Nd 같은 문자 범주가 어디서 왔는지 궁금하다면 원문 표준 문서에서 자세히 볼 수 있어요.
- 이어지는 Letters and digits 절에서
unicode_letter와unicode_digit가 실제 식별자를 구성하는 데 어떻게 쓰이는지 이어서 확인해 보세요.