좋은 질문입니다! Rust에서 **크레이트(crate)**는 단순히 “파일”이나 “컴파일된 바이너리” 중 하나만으로 정의되지 않습니다. Rust의 컴파일과 코드 구조를 이해하는 핵심 개념인데요, 아래와 같이 정리해드립니다.
크레이트는 "Rust 컴파일러가 하나의 단위로 컴파일하는 코드 집합"입니다.
즉, 소스 코드 집합 + 메타정보 + 결과물(라이브러리 or 바이너리) 전부를 의미합니다.
| 요소 | 설명 |
|---|---|
| 📄 소스코드 | main.rs, lib.rs, 또는 mod.rs 등의 Rust 파일 |
| 📦 메타정보 | Cargo.toml (크레이트 이름, 의존성 등 정의) |
| 🛠️ 컴파일 결과 | 바이너리(실행파일) or 라이브러리(.rlib, .so 등) |
| 크레이트 종류 | 예시 | 설명 |
|---|---|---|
| 📘 바이너리 크레이트 | src/main.rs | fn main()이 있는 실행형 애플리케이션 |
| 📗 라이브러리 크레이트 | src/lib.rs | 다른 코드에서 extern crate 또는 use로 가져올 수 있는 코드 모음 |
my_project/ ← 크레이트 루트 (Cargo.toml 존재)
├── Cargo.toml ← 크레이트 메타데이터
└── src/
├── main.rs ← 바이너리 크레이트 (실행파일)
└── lib.rs ← 라이브러리 크레이트 (선택적)
cargo build → 크레이트 단위로 컴파일cargo run → 바이너리 크레이트 실행| 구분 | 설명 |
|---|---|
| 파일 | .rs 파일 하나. mod.rs, foo.rs, bar.rs 등 |
| 모듈 | 크레이트 안에서 mod xxx로 정의된 논리적 단위 |
| 크레이트 | Rust 컴파일러가 하나의 단위로 처리하는 전체 패키지 or 라이브러리 or 바이너리 |
크레이트는 보통 여러 모듈(그리고 파일)로 구성됩니다.
그리고 하나의 프로젝트에는 **하나 이상의 크레이트(라이브러리 + 바이너리)**가 존재할 수 있습니다.
크레이트는 ‘.rs 파일’이 아니라, 그 파일들이 모여 만들어지는 “컴파일 단위 전체”입니다.
컴파일 후에는 바이너리(.exe)나 라이브러리(.rlib) 로 변환됩니다.
필요하시면 “크레이트 ↔ 모듈 ↔ 파일” 관계를 도식으로 그려드릴 수도 있습니다.