::은 “어디에 속한 항목인지” 또는 “어떤 타입인지”를 명시할 때 쓰이며, 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::PI | f64타입의 연관 상수 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"
}
위 코드의 실행 결과는 아래와 같습니다.
