부록 A: 키워드
부록 A: 키워드 (Keywords)
Rust 언어에서 지금 쓰이거나 앞으로 쓰일 예정인 예약어 목록을 정리한 페이지예요. 예약어는 그대로는 식별자(identifier)로 못 쓴다는 게 핵심인데, 다만 이 장 뒤에 나올 "Raw Identifiers" 절에서 설명하는 것처럼 원시 식별자 형태로는 얼마든지 쓸 수 있답니다. 식별자라 함은 함수·변수·파라미터·구조체 필드·모듈·크레이트·상수·매크로·정적 값·어트리뷰트·타입·트레이트·라이프타임 같은 이름을 통틀어 말해요.
출처: Rust 공식문서
본문
현재 사용 중인 키워드
지금 실제로 쓰이고 있는 키워드 목록이에요. 각각이 무슨 일을 하는지 살펴볼게요.
as: 원시 타입 캐스팅을 수행하고, 아이템을 담고 있는 특정 트레이트를 명확히 구분하거나,use문 안에서 아이템의 이름을 바꿔요.async: 현재 스레드를 막지 않고Future를 반환해요.await:Future의 결과가 준비될 때까지 실행을 멈춰요.break: 루프에서 즉시 빠져나와요.const: 상수 아이템이나 상수 원시 포인터를 정의해요.continue: 다음 루프 반복으로 넘어가요.crate: 모듈 경로 안에서 크레이트 루트를 가리켜요.dyn: 트레이트 객체에 대한 동적 디스패치(dynamic dispatch)를 뜻해요.else:if와if let제어 흐름 구조의 대체(fallback) 분기예요.enum: 열거형(enumeration)을 정의해요.extern: 외부 함수나 변수를 연결(link)해요.false: 불리언 false 리터럴이에요.fn: 함수나 함수 포인터 타입을 정의해요.for: 이터레이터의 아이템을 순회하거나, 트레이트를 구현하거나, 더 높은 등급의 라이프타임(higher-ranked lifetime)을 지정해요.if: 조건식 결과에 따라 분기해요.impl: 고유(inherent) 또는 트레이트 기능을 구현해요.in:for루프 문법의 일부예요.let: 변수를 바인딩해요.loop: 조건 없이 반복해요.match: 값을 패턴과 대조해요.mod: 모듈을 정의해요.move: 클로저가 캡처한 모든 값을 소유권으로 가져가게 해요.mut: 참조·원시 포인터·패턴 바인딩에서 가변성(mutability)을 나타내요.pub: 구조체 필드·impl블록·모듈에서 공개(public) 가시성을 나타내요.ref: 참조로 바인딩해요.return: 함수에서 반환해요.Self: 지금 정의하거나 구현 중인 타입에 대한 타입 별칭(type alias)이에요.self: 메서드의 주체(subject) 또는 현재 모듈을 가리켜요.static: 프로그램 실행 내내 지속되는 전역 변수 또는 라이프타임을 뜻해요.struct: 구조체(structure)를 정의해요.super: 현재 모듈의 부모 모듈을 가리켜요.trait: 트레이트를 정의해요.true: 불리언 true 리터럴이에요.type: 타입 별칭이나 연관 타입(associated type)을 정의해요.union: 유니온을 정의해요. 다만 유니온 선언 안에서 쓸 때만 키워드로 작동해요.unsafe: 안전하지 않은(unsafe) 코드·함수·트레이트·구현을 나타내요.use: 심볼을 스코프로 가져와요.where: 타입을 제약하는 절(clause)을 나타내요.while: 식의 결과에 따라 조건적으로 반복해요.
향후 사용을 위해 예약된 키워드
아직은 아무 기능이 없지만, Rust가 앞으로 쓸 수도 있게 미리 예약해 둔 키워드들이에요.
abstract
become
box
do
final
gen
macro
override
priv
try
typeof
unsized
virtual
yield
원시 식별자 (Raw Identifiers)
원시 식별자는 평소에는 키워드를 쓸 수 없는 자리에 키워드를 쓸 수 있게 해 주는 문법이에요. 사용법은 아주 간단한데, 키워드 앞에 r#을 붙이면 돼요. 예를 들어 match는 키워드잖아요. 그런데 이 함수처럼 match를 함수 이름으로 써 보면:
Filename: src/main.rs
fn match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
바로 이런 에러가 나와요.
error: expected identifier, found keyword `match`
--> src/main.rs:4:4
|
4 | fn match(needle: &str, haystack: &str) -> bool {
| ^^^^^ expected identifier, found keyword
에러 메시지를 보면 키워드 match를 함수 식별자로 못 쓴다고 알려 주죠. match를 함수 이름으로 쓰고 싶다면 이번엔 원시 식별자 문법, 즉 r#을 붙여서 이렇게 작성하면 돼요.
Filename: src/main.rs
fn r#match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
fn main() {
assert!(r#match("foo", "foobar"));
}
이 코드는 에러 없이 잘 컴파일돼요. 정의 부분과 main에서 부르는 지점 양쪽 모두 함수 이름에 r# 접두사가 붙어 있는 걸 눈여겨보세요.
원시 식별자를 쓰면 설령 그 단어가 예약된 키워드라 하더라도 원하는 어떤 단어든 식별자로 쓸 수 있어요. 덕분에 식별자 이름을 고를 자유가 넓어지고, 그 단어들이 키워드가 아닌 언어로 작성된 프로그램과도 자연스럽게 연동할 수 있죠.
게다가 원시 식별자는 내 크레이트와 다른 Rust 에디션으로 작성된 라이브러리를 쓸 때도 유용해요. 예를 들어 try는 2015 에디션에서는 키워드가 아니지만, 2018·2021·2024 에디션에서는 키워드로 바뀌었어요. 만약 2015 에디션으로 작성됐고 try라는 함수를 가진 라이브러리에 의존한다면, 그 함수를 호출하려면 원시 식별자 문법, 즉 여기서는 r#try를 써야 해요. 에디션에 대한 더 자세한 내용은 부록 E를 참고해 주세요.
더 알아보기
- 부록 E: 에디션 (Appendix E – Editions) — 에디션별로 키워드가 어떻게 달라지는지 확인할 수 있어요.
- 유니온(Union) 참조 문서 —
union키워드의 실제 의미를 더 자세히 보고 싶다면 참고하세요. - Rust Reference: 식별자(Identifiers) — 식별자 규칙과 원시 식별자 문법의 공식 규격을 다룹니다.