정확히 짚으셨습니다! Rust의 mod 시스템은 디렉토리 구조와 모듈 선언이 자동으로 연결되는 일관된 규칙을 따릅니다. 그래서 하위 디렉토리에 있어도 mod bar;처럼 동일한 방식으로 선언할 수 있는 것입니다.
mod가 찾는 파일 규칙Rust 컴파일러는 mod xxx;를 보면 아래 두 가지 경로 중 하나를 자동으로 찾습니다:
src/xxx.rssrc/xxx/mod.rs즉, mod foo;나 mod bar;는 각각 아래 중 하나를 찾습니다:
| 모듈 선언 | 컴파일러가 찾는 위치 |
|---|---|
mod foo; | src/foo.rs or src/foo/mod.rs |
mod bar; | src/bar.rs or src/bar/mod.rs |
foo.rs (단일 파일 모듈)src/
├── main.rs ← 크레이트 루트
├── foo.rs ← 여기를 `mod foo;`로 선언
// main.rs
mod foo;
fn main() {
foo::hello();
}
bar/mod.rs (디렉토리 모듈)src/
├── main.rs
└── bar/
└── mod.rs ← 여기를 `mod bar;`로 선언
// main.rs
mod bar;
fn main() {
bar::greet();
}
// bar/mod.rs
pub fn greet() {
println!("Hello from bar!");
}
✅ 디렉토리 안에
mod.rs가 있으면, Rust는 그것을 하위 모듈의 루트 파일로 자동 인식합니다.
Rust는 모듈 선언과 파일 구조를 명시적으로 연결해서:
| 선언 방식 | 대응 파일 | 디렉토리 여부 |
|---|---|---|
mod foo; | foo.rs 또는 foo/mod.rs | 상관 없음 |
mod bar; | bar.rs 또는 bar/mod.rs | 상관 없음 |
👉 그래서 foo.rs든 bar/mod.rs든 둘 다 동일하게 mod foo;, mod bar;로 쓸 수 있는 것입니다.
원하시면 mod, use, pub을 모두 엮은 실전 예제 프로젝트도 만들어 드릴 수 있습니다.