1.4. 식별자
식별자는 변수와 함수, 타입, 모듈 등에 이름을 붙이는 토큰입니다.
1.4.1. 형식
식별자는 유니코드 표준 부속서 #31 (UAX #31) 의 기본 정의 (XID_Start / XID_Continue) 에 다음을 더한 것입니다. 첫째는 밑줄 _, 둘째는 수학 표기 프로필, 셋째는 프라임, 넷째는 이모지입니다.
identifier ::= identifier_start identifier_continue*
identifier_start ::= xid_start | "_" | math_start | emoji | flag
identifier_continue ::= xid_continue | math_continue | prime | emoji | emoji_component
중요
사람의 언어와 수학 기호로 변수 이름을 쓸 수 있습니다. 첫 글자가 숫자가 아니면 됩니다.
Unicode 기준 버전
XID_Start, XID_Continue, ID_Compat_Math_Start, ID_Compat_Math_Continue, Extended_Pictographic 속성은 Unicode 18.0.0 (UCD 18.0.0) 의 표를 따릅니다.
수학 표기 프로필
UAX #31 §7.1 "Mathematical Compatibility Notation Profile" 을 따릅니다. math_start 는 ID_Compat_Math_Start 에 n-항 연산 기호 ∑ ∏ ∫ 를 더한 것이고, math_continue 는 ID_Compat_Math_Continue 에 같은 세 기호를 더한 것입니다. 아래 표는 참고용 예시이며 (UCD 18.0 기준), 권위는 속성입니다.
| 집합 | 코드포인트 |
|---|---|
math_start | ∂ U+2202, ∇ U+2207, ∞ U+221E, 그 수학 스타일 변형 U+1D6C1, U+1D6DB, U+1D6FB, U+1D715, U+1D735, U+1D74F, U+1D76F, U+1D789, U+1D7A9, U+1D7C3 (𝛁 𝛛 𝛻 𝜕 𝜵 𝝏 𝝯 𝞉 𝞩 𝟃), 그리고 ∑ U+2211, ∏ U+220F, ∫ U+222B |
math_continue | math_start 전부, 위 첨자 ¹ ² ³ ⁰ ⁴-⁹ ⁺ ⁻ ⁼ ⁽ ⁾ (U+00B2, U+00B3, U+00B9, U+2070, U+2074-207E), 아래 첨자 ₀-₉ ₊ ₋ ₌ ₍ ₎ (U+2080-208E) |
∑ ∏ ∫ 는 함수 이름으로 쓸 수 있도록 rok 이 더한 것이며, 이 때문에 연산자 토큰이 될 수 없습니다.
프라임
′ ″ ‴ ⁗ (U+2032-2034, U+2057) 는 identifier_continue 에만 올 수 있습니다 (f′, x″).
이모지
emoji:Extended_Pictographic속성을 가진 코드포인트 가운데 U+00FF 이하 (©,®등) 를 제외한 것입니다. 시작과 이어지는 자리 모두에 올 수 있습니다.emoji_component: 이어지는 자리에만 올 수 있습니다.- ZWJ (U+200D) - 두 pictograph 사이에서만
- 변형 선택자 U+FE0E / U+FE0F - 정규화에서 제거됨 (1.4.2)
- 피부색 수식자 U+1F3FB-1F3FF
- 지역 표시자 U+1F1E6-1F1FF (국기)
- 태그 U+E0020-E007F
flag: 지역 표시자 두 개로 된 국기 (🇰🇷) 는 식별자의 시작에도 올 수 있습니다.
키캡 시퀀스 (1️⃣) 는 숫자로 시작하므로 식별자가 아닙니다.
x² 는 이름입니다
x² 는 x 의 제곱이 아니라 x² 라는 하나의 이름입니다. 제곱은 x * x 나 x.pow(2) 로 씁니다.
정상 예
count
my_var
α
β2
Δt
σ²
x₀
f′
∂u
∇φ
∑
변수1
データ
🚀count
_internal
비정상 예
2x // 첫 글자가 숫자
my-var // '-' 는 식별자 글자가 아님
my var // 공백
′x // 프라임은 시작 글자가 될 수 없음
1️⃣ // 키캡 - 숫자로 시작
1.4.2. 정규화
식별자는 NFC (Normalization Form C) 로 정규화한 뒤 변형 선택자 U+FE0E / U+FE0F 를 제거한 형태로 비교됩니다. 따라서 사전합성된 é 와 결합 형태인 e + ◌́ 는 같은 식별자이고, ❤️ 와 ❤ 도 같은 식별자입니다. 컴파일러는 식별자를 토큰화한 직후에 이 정규화를 적용합니다.
이러한 결정은 검색 가능성과 진단 메시지의 일관성을 확보하기 위한 것입니다.
혼동 경고
컴파일러는 다음 경우에 경고 를 냅니다 (에러가 아닙니다).
- 같은 패키지 안에서 (파일을 가리지 않고) 서로 다른 이름이 같은 skeleton 을 가질 때. skeleton 은 NFKC 정규화에 confusable 접기를 더한 것이며, 구현은 UTS #39 의 confusable 표 가운데 일부만 써도 됩니다. 예:
σ²와σ2, 라틴a와 키릴а. - 한 식별자 안에서 키릴 문자가 라틴 또는 그리스 문자와 섞일 때. 라틴과 그리스의 혼합 (
Δt,σx) 은 수학 이름에 흔하므로 경고하지 않으며, 한글, 한자, 가나와 라틴의 혼합도 경고하지 않습니다.
1.4.3. 대소문자
식별자는 대소문자를 구분합니다. 따라서 count 와 Count 는 서로 다른 토큰입니다.
권장 명명 규약인 snake_case, PascalCase, SCREAMING_SNAKE 은 스타일 가이드의 영역에 속하며, 사양이 강제하지는 않습니다.
1.4.4. 키워드와의 충돌
키워드 에서 정의하는 예약어와 정확히 일치하는 토큰은 식별자가 아니라 키워드로 분류됩니다. 문맥 키워드는 정해진 위치 밖에서 식별자이며, . 뒤, 필드 이름 선언, 이름 있는 인자 자리에서는 예약어도 식별자입니다 (1.5.5). 예약어를 식별자로 쓸 수 있게 하는 raw 식별자, 이를테면 Rust 의 r#fn 과 같은 장치는 도입하지 않습니다. 혼동의 비용이 거기서 얻는 가치보다 크다고 판단했습니다.
1.4.5. 길이 제한
본 사양은 식별자 길이의 상한을 정하지 않으며, 소스 파일 의 일반 규칙을 따릅니다.
1.4.6. 단일 밑줄
밑줄 한 글자 (_) 는 식별자로 인정됩니다만, 패턴 매칭과 값 폐기에서 특별한 의미를 갖습니다. 그 의미는 패턴 사양에서 정의합니다. 어휘 단계에서는 한 글자짜리 식별자로 토큰화됩니다.