식별자
식별자 (Identifiers)
코드를 짜다 보면 이름을 붙이는 일이 유난히 많죠. 변수, 함수, 타입, 상수까지 — 모든 것에 이름을 지어야 하니까요. 그래서 이름에 어떤 규칙이 있는지, 그리고 그 규칙을 벗어나야 할 때는 어떻게 하는지를 먼저 정리해 둘게요.
본문
식별자는 알파벳 문자나 밑줄(_)로 시작해야 하고, 그 뒤에는 알파벳 문자·숫자·밑줄이 몇 개든 이어질 수 있어요. 다만 예약어(keyword)와 겹치면 안 됩니다. 어떤 단어가 예약어로 잡혀 있는지는 Keyword Reference에서 확인할 수 있어요.
문자열 식별자 구문
그런데 가끔은 이런 규칙을 벗어나는 이름이 꼭 필요한 경우가 있어요. 외부 라이브러리와 연결할 때가 대표적이죠. 그럴 때는 @"..." 구문을 쓰면 됩니다. 다음 코드에서 이름에 공백이 들어가거나, 숫자로 시작하거나, 아예 예약어인 경우를 @"..."로 감싸는 걸 볼게요.
const @"identifier with spaces in it" = 0xff;
const @"1SmallStep4Man" = 112358;
const c = @import("std").c;
pub extern "c" fn @"error"() void;
pub extern "c" fn @"fstat$INODE64"(fd: c.fd_t, buf: *c.Stat) c_int;
const Color = enum {
red,
@"really red",
};
const color: Color = .@"really red";
위에서 두 가지 흐름이 자연스럽게 보이죠. 먼저 @import("std").c처럼 이름 자체에 공백이 있거나 숫자로 시작하는 상수는 @"..."로 그대로 이름을 씁니다. 그리고 extern "c" 함수 선언처럼 C 라이브러리의 함수명을 그대로 가져와야 할 때도 같은 방식으로 써요 — @"error"나 @"fstat$INODE64"처럼 $ 같은 특수 문자가 들어간 이름도 문제없이 연결할 수 있고요. 마지막의 Color 열거형은 값의 이름을 @"really red"처럼 지정할 수 있다는 걸 보여줘요.
이 @"..." 구문은 이름을 감싸는 문법일 뿐이라, 아무 @ 연산자와 혼동하지 않아요. 실제로는 문자열을 그대로 하나의 식별자처럼 취급한다고 이해하면 됩니다.
더 알아보기
- Keyword Reference — 식별자로 쓸 수 없는 예약어 목록
- Primitive Types — Zig의 기본 타입들