이름
이름 (Names)
코드에서는 타입, 함수, 변수 같은 것들을 가리킬 때 이름을 써요. 그런데 이 "이름으로 가리킴"이 정확히 어떻게 일어나는지, 선언된 이름은 어디까지 유효한지 궁금하지 않나요? 이 글에서 Rust의 이름(names) 개념을 정리해 볼게요.
출처: Rust Reference
본문
엔티티(entity) 는 소스 프로그램 안에서 어떤 방식으로든 참조될 수 있는 언어 구성 요소예요. 보통 경로(path)로 참조하고요. 엔티티에는 타입, 아이템, 제네릭 매개변수, 변수 바인딩, 루프 레이블, 수명, 필드, 속성, lints 등이 있어요.
선언(declaration) 은 엔티티를 가리키는 이름을 도입하는 구문적 구성 요소예요. 도입된 엔티티 이름은 스코프(scope) 안에서 유효해요. 스코프는 그 이름을 참조할 수 있는 소스 텍스트의 영역이죠.
엔티티 중에는 소스 코드에서 명시적으로 선언되는 것도 있고, 언어나 컴파일러 확장의 일부로 암묵적으로 선언되는 것도 있어요.
이름을 참조하는 방법은 몇 가지로 정리할 수 있어요.
- 경로(path)로 엔티티를 참조할 수 있는데, 다른 모듈이나 타입 안에 있는 엔티티도 가리킬 수 있어요.
- 수명과 루프 레이블은 앞에 작은따옴표
'를 붙이는 전용 문법을 사용해요. - 이름은 서로 다른 네임스페이스로 나뉘어요. 다른 네임스페이스의 엔티티는 같은 이름을 공유해도 충돌하지 않아요.
- 이름 해석(name resolution)은 경로·식별자·레이블을 엔티티 선언에 연결하는 컴파일 타임 과정이에요.
- 어떤 이름에는 가시성(visibility)에 따라 접근이 제한될 수 있어요.
명시적으로 선언되는 엔티티 (Explicitly declared entities)
소스 코드에서 이름을 명시적으로 도입하는 엔티티들이에요.
아이템 (Items):
- 모듈 선언
- 외부 크레이트 선언
- use 선언
- 함수 선언과 함수 매개변수
- 타입 별칭
- struct, union, enum, enum 변형 선언과 그 이름 붙은 필드
- 상수 아이템 선언
- 정적 아이템 선언
- 트레이트 아이템 선언과 그 연관 아이템
- 외부 블록 아이템
macro_rules선언과 매처 메타변수- 구현(implementation)의 연관 아이템
표현식 (Expressions):
기타:
또한 매크로 인보케이션과 속성은 그중 하나로 확장되면서 이름을 도입할 수도 있어요. 몇 가지 속성이 관련돼요.
macro_use속성은 다른 크레이트의 매크로 이름을 도입할 수 있고,macro_export속성은 매크로의 별칭을 크레이트 루트에 도입할 수 있어요.
암묵적으로 선언되는 엔티티 (Implicitly declared entities)
언어 자체가 정의하거나 컴파일러 옵션·확장이 도입하는 엔티티들이에요.
- 언어 프렐류드(Language prelude):
- 내장 속성
- 표준 라이브러리 프렐류드의 아이템, 속성, 매크로
- 루트 모듈에 있는 표준 라이브러리 크레이트
- 컴파일러가 링크하는 외부 크레이트
- 툴 속성
- Lints와 툴 lint 속성
- derive 헬퍼 속성은 명시적으로 가져오지 않아도 아이템 안에서 유효해요
'static수명
마지막으로, 크레이트 루트 모듈은 이름이 없지만 특정 경로 한정자(path qualifiers)나 별칭으로 참조할 수 있어요.
더 알아보기 (Learn more)
- 네임스페이스 (Namespaces) — 이름을 종류별로 나누는 방식
- 이름 해석 (Name resolution) — 이름을 선언에 연결하는 과정
- 경로 (Paths) — 이름을 참조하는 경로 표현식
- 가시성과 프라이버시 (Visibility and privacy) — 이름 접근 제한