(Rust) use와 match 정리
Rust 예제에서 use와 match는 함께 자주 나오지만 사용하는 역할이 다름.
use는 경로에 있는 이름을 현재 범위로 가져오고, match는 값과 패턴을 대조해 실행할 코드를 고름.
목차
- use
- crate::
- `*` 표현식
- match
- use로 match arm 간결하기 표현하는 방법
- 이름 충돌과 전체 경로
use
다음 열거형의 두 변형은 Status::Poor, Status::Rich라는 경로를 가짐.
enum Status {
Poor,
Rich,
}
let status = Status::Poor;
use로 두 변형을 현재 범위에 가져오면 짧은 이름을 쓸 수 있음.
enum Status {
Poor,
Rich,
}
use Status::{ Poor, Rich };
let status = Poor;
Poor라는 새 값이 생기는 것은 아님. 현재 범위의 Poor가 기존 변형 Status::Poor를 가리킴.
crate::
crate::는 현재 파일이 아니라 현재 크레이트를 기준으로 경로를 찾음. 다음 코드는 크레이트 루트에 Status가 있고 그 아래 report 모듈이 있는 경우임. crate::Status::Poor는 루트의 열거형 변형을 가져옴.
enum Status {
Poor,
Rich,
}
mod report {
use crate::Status::Poor;
fn default_status() -> super::Status {
Poor
}
}
Status::Poor는 현재 범위에서 보이는 Status를 기준으로 찾음. 두 표기가 같은 대상을 가리키려면 그 Status가 크레이트 루트의 열거형이어야 함. Rust 경로의 기준은 소스 파일 위치와 같지 않음.
* 표현식
열거형 경로 뒤의 *는 모든 변형을 현재 범위로 가져옴.
enum Work {
Civilian,
Soldier,
}
use Work::*;
let work = Civilian;
이 범위에서 Civilian은 Work::Civilian을 가리킴. 변형이 많거나 다른 타입과 이름이 겹치면 출처를 알아보기 어려워질 수 있음.
match
match의 각 arm은 비교할 패턴과 실행할 표현식을 =>로 연결함.
enum Status {
Poor,
Rich,
}
let status = Status::Poor;
match status {
Status::Rich => println!("부자"),
Status::Poor => println!("가난한 사람"),
}
status가 어떤 변형인지에 따라 하나의 arm이 선택됨. 열거형을 매칭할 때는 가능한 변형을 모두 처리해야 하므로 위 코드에는 Rich와 Poor arm이 모두 필요함.
일부 경우를 묶으려면 와일드카드 패턴 _를 사용함. match 자체도 표현식이라 선택한 arm의 값을 반환할 수 있음.
let number = 2;
let text = match number {
1 => "one",
2 => "two",
_ => "other",
};
assert_eq!(text, "two");
use로 match arm 간결하기 표현하는 방법
열거형 변형을 가져오면 match arm에서도 타입 경로를 생략할 수 있음.
enum Status {
Poor,
Rich,
}
use Status::{Poor, Rich};
let status = Poor;
match status {
Rich => println!("The rich have lots of money!"),
Poor => println!("The poor have no money..."),
}
여기서 Rich와 Poor는 변수나 문자열이 아니라 Status의 변형을 가리키는 패턴임.
이름 충돌과 전체 경로
서로 다른 열거형에 같은 이름의 변형이 있으면 두 변형을 같은 이름으로 가져올 수 없음.
enum Status {
Poor,
}
enum Condition {
Poor,
}
let status = Status::Poor;
let condition = Condition::Poor;
전체 경로를 유지하면 두 Poor의 출처가 코드에 남음. 한쪽만 자주 쓴다면 하나만 use로 가져오는 방법도 있음.
둘 다 가져와야 한다면 as로 별칭을 붙일 수 있음.
enum Status { Poor }
enum Condition { Poor }
use Status::Poor as PoorStatus;
use Condition::Poor as PoorCondition;
let status = PoorStatus;
let condition = PoorCondition;
마지막으로 실무에서 개발하다 보니까 이름이 겹치는 경우가 존재하여 가급적이면 명확하게 Status::Poor처럼 전체 경로를 쓰는 편이 분명해서 좋은 것 같음.
(참고)
'Rust' 카테고리의 다른 글
| (Rust) 참조와 역참조 정리 (*, &) (0) | 2026.09.09 |
|---|---|
| (Rust) 에러 전파 연산자 정리 (0) | 2026.09.09 |
| (Rust) Display와 Debug 출력 형식 비교 (0) | 2026.09.08 |
| (Rust) Copy와 Clone 차이점 정리 (0) | 2026.07.04 |
| (Rust) 소유권 (Ownership) 이해하기 (0) | 2026.07.04 |