Rust

(Rust) use와 match 정리

lgvv 2026. 9. 9. 00:17

(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처럼 전체 경로를 쓰는 편이 분명해서 좋은 것 같음.

 

 

(참고)