Rust에서 ::의 용도 정리표

::은 “어디에 속한 항목인지” 또는 “어떤 타입인지”를 명시할 때 쓰이며, enum일 수도, 모듈일 수도, 제네릭 타입 지정(Turbofish)일 수도 있으며, 연관 함수, 상수 또는 연관 상수에 접근할 때도 사용되고, 트레이트 경로를 통한 메소드 호출 시에도 사용됩니다.

1. Rust에서 ::의 용도 정리표

구분예시설명관련 키워드
모듈/경로 구분자std::fs::File모듈(std) → 하위 모듈(fs) → 항목(File)로 내려가는 경로 지정모듈(module), 네임스페이스(namespace)
enum variant 접근Option::Some(5)Optionenum 안의 Somevariant에 접근enum
연관 함수(associated function) 접근String::from(“hi”)타입(String)의 연관 함수(from) 호출struct, enum, trait
상수 또는 연관 상수 접근std::f64::consts::PIf64타입의 연관 상수 PI에 접근상수(const)
Turbofish (제네릭 타입 명시)“42”.parse::<i32>()제네릭 함수의 타입 매개변수를 명시적으로 지정제네릭(Generic)
제네릭 타입 생성 시 타입 지정Vec::<i32>::new()제네릭 타입(Vec<T>)의 매개변수를 명시적으로 지정제네릭 타입
트레이트 경로를 통한 메서드 호출<T as SomeTrait>::method()특정 트레이트에 정의된 메서드를 명시적으로 호출트레이트(impl 충돌 해결용)

2. 예시 모음

mod math {
    pub const PI: f64 = 3.14;
}

#[derive(Debug)]
#[allow(dead_code)]
enum Color {
    Red,
    Blue,
}

fn main() {
    // 1️⃣ 모듈 경로
    println!("{}", math::PI);        // -> 3.14

    // 2️⃣ enum variant 접근
    let c = Color::Red;
    println!("{c:?}");

    // 3️⃣ 연관 함수
    let s = String::from("hello");
    println!("{s:?}");

    // 4️⃣ Turbofish
    let n = "42".parse::<i32>().unwrap();
    println!("{n:?}");

    // 5️⃣ 제네릭 타입 지정
    let v = Vec::<i32>::new();
    println!("{v:?}");

    // 6️⃣ 트레이트 메서드 명시 호출
    use std::string::ToString;
    let x = 10;
    let s = <i32 as ToString>::to_string(&x);
    println!("{}", s);  // "10"
}    

위 코드의 실행 결과는 아래와 같습니다.

::의 다양한 용도 실행 결과

Rust에서 사용되는 기호의 의미 및 읽는 방법

Rust는 소유권, 빌림, 트레이트 등 문법도 복잡하지만, 기호도 처음 보는 것이 많아 헷갈리게 하는데 정리해봤습니다. 인쇄해놓고 보면 좋을 듯 합니다.

기호 / 표기의미설명예시영어 읽기한국어 읽기
!매크로이름 뒤에 붙어 해당 이름이 매크로임을 표시println!, dbg!, vec!macro / bang매크로
?에러 전파Result나 Option에서 에러를 즉시 반환let x = foo()?;question mark물음표
::경로 연산자모듈, 구조체, 함수 등의 경로 지정std::io::Resultdouble colon더블 콜론 / 경로 연산자
*역참조참조 값을 직접 접근*r = 10;asterisk / deref별 / 역참조
_와일드카드사용하지 않는 값, 이름 무시let _ = foo();underscore언더스코어 / 무시
->함수 반환 타입함수 반환을 표시fn foo() -> i32 { 5 }arrow화살표 / 반환
=>매칭 암시match에서 패턴 결과 지정match x { 1 => “one”, _ => “other” }fat arrow두꺼운 화살표 / →
::<turbofish제네릭 타입을 명시적으로 지정Vec::<i32>::new()turbofishturbofish / 제네릭 타입 명시
..범위 연산자일부 범위, 구조체 업데이트 등에 사용0..5, ..Default::default()dot dot범위 / 나머지 필드
..=포함 범위끝 값을 포함하는 범위0..=5dot dot equal포함 범위
&참조변수/값을 빌려오기let r = &x;reference참조
&mut가변 참조변수/값을 가변으로 빌려오기let mr = &mut y;mutable reference가변 참조
ref/ ref mut패턴용 참조패턴 매칭에서 참조를 얻음let Point { x: ref r, .. } = p;ref / ref mut참조 / 가변 참조 패턴
mut가변성변수 또는 참조를 변경 가능하게let mut x = 5;mut뮤트 / 가변
..(패턴)구조체/튜플 패턴일부 필드만 바인딩하고 나머지 무시Point { x, .. }dot dot범위 / 나머지 필드 무시
라이프타임참조가 유효한 범위를 지정&’static strsingle quote / tick라이프타임 / 스태틱 라이프타임

ChatGPT의 도움을 받았는데, ChatGPT도 헷갈려 하네요.
예를 들어 *를 asterisk라고 하고, !를 bang이라고 하고 헷갈리네요.

하나 더 참고

'Underscore'와 'underbar'는 같은 기호(_)를 가리키는 다른 이름으로, 'underscore'가 정식 명칭이고 'underbar'는 비정식적인 표현입니다.