본문 바로가기

Rust

모듈시스템

rust의 모듈 시스템에 대한 정리

 

cargo는 파일의 이름, 위치를 통해 빌드, 컴파일하는 파일이 라이브러리 크레이트인지 바이너리 크레이트인지 구분한다.

 

src/lib.rs 는 라이브러리 크레이트로

src/main.rs 는 프로젝트 이름을 갖는 크레이트로

src/bin/*.rs 는 *.rs 각 파일의 이름을 가지는 크레이트로

 

더불어 Cargo.toml 파일에 지정하여 수동제어도 가능하다.

 

crate:: , crate root 부터 탐색

super::, 부모 모듈 탐색

 

rust는 부모가 자식을 mod 키워드로 선언해줘야 한다. 

pub mod로 자식을 선언하면 선언을 한 해당 부모를 통해 자식에 접근 가능해진다.

 

mod로 선언된 자식에서는 부모의 자원에 접근 가능하지만 부모에서 자식의 자원에 접근하는 것은 기본적으로 불가능하다.

이는 자식에서 pub를 붙여 선언한 자원들에 대해서만 부모가 접근 가능하도록 만들 수 있다.

 

pub mod 로 자식을 공개시키는 것과 해당 자식의 자원에 접근하는 것은 별개의 과정이다. 해당 자식의 자원에 접근하기 위해서는 자식의 코드에서 pub가 붙은 자원에만 접근 가능하다.

 

Before

mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}
    }
}

pub fn eat_at_restaurant() {
    // 절대 경로
    crate::front_of_house::hosting::add_to_waitlist();

    // 상대 경로
    front_of_house::hosting::add_to_waitlist();
}

 

After

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

pub fn eat_at_restaurant() {
    // 절대 경로
    crate::front_of_house::hosting::add_to_waitlist();

    // 상대 경로
    front_of_house::hosting::add_to_waitlist();
}

 

구조체와 열거형에도 pub를 붙여 공개 가능한데 주의할 점이 있다.

만약 구조체의 공개를 위해 pub struct 만 사용하면 필드에는 접근이 불가능하다.

구조체의 필드에도 각각 pub를 이용하여 공개/비공개 설정이 가능하다.

반대로 열거형은 pub enum 만 사용해도 각각의 베리언트(값) 들에 접근 가능하다.

 

use는 단축경로를 생성하는 것, 심볼릭 링크를 만드는 거라고 보면 된다.

C++의 namespace와 비슷하니 설명 생략

 

pub use라는게 존재한다.

그냥 use만 사용하면 해당 스코프에서만 사용하는 축약어가 되는 것이기에 만약 자식 모듈에서 같은 축약어를 사용하도록 만드려면 pub use를 사용해야한다.

 

use에 중첩구문을 사용할 수 있다.

 

Before

// --생략--
use std::cmp::Ordering;
use std::io;
use std::io::Write;
// --생략--

 

After

// --생략--
use std::{cmp::Ordering, io::{self, Write}};
// --생략--

 

use std::io::*; 처럼 * 을 붙여 공개된 모든 자원을 가져오는게 가능하다.

'Rust' 카테고리의 다른 글

트레이트, 라이프타임  (0) 2026.01.12
열거형 (enumerate)  (0) 2026.01.06
구조체 (struct), 약간의 메크로 얘기  (0) 2026.01.05
소유권 (Ownership)  (0) 2026.01.04
조건, 반복문  (0) 2026.01.04