부록 A: 키워드

부록 A: 키워드 (Keywords)

Rust 언어에서 지금 쓰이거나 앞으로 쓰일 예정인 예약어 목록을 정리한 페이지예요. 예약어는 그대로는 식별자(identifier)로 못 쓴다는 게 핵심인데, 다만 이 장 뒤에 나올 "Raw Identifiers" 절에서 설명하는 것처럼 원시 식별자 형태로는 얼마든지 쓸 수 있답니다. 식별자라 함은 함수·변수·파라미터·구조체 필드·모듈·크레이트·상수·매크로·정적 값·어트리뷰트·타입·트레이트·라이프타임 같은 이름을 통틀어 말해요.

출처: Rust 공식문서

본문

현재 사용 중인 키워드

지금 실제로 쓰이고 있는 키워드 목록이에요. 각각이 무슨 일을 하는지 살펴볼게요.

  • as: 원시 타입 캐스팅을 수행하고, 아이템을 담고 있는 특정 트레이트를 명확히 구분하거나, use 문 안에서 아이템의 이름을 바꿔요.
  • async: 현재 스레드를 막지 않고 Future를 반환해요.
  • await: Future의 결과가 준비될 때까지 실행을 멈춰요.
  • break: 루프에서 즉시 빠져나와요.
  • const: 상수 아이템이나 상수 원시 포인터를 정의해요.
  • continue: 다음 루프 반복으로 넘어가요.
  • crate: 모듈 경로 안에서 크레이트 루트를 가리켜요.
  • dyn: 트레이트 객체에 대한 동적 디스패치(dynamic dispatch)를 뜻해요.
  • else: ifif 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를 참고해 주세요.

더 알아보기