Rust - Basic - 07 - 패키지 크레이트 모듈

패키지 크레이트 모듈

이해

하나의 package에는 library crate를 최대 하나만 둘 수 있지만 binary crate는 여러 개 둘 수 있습니다.

  • module과 pub
    mod front_of_house {
        // 다른 module이 중첩 module을 참조하려면 pub이 필요함
        pub mod hosting {
            // 다른 module이 이 fn을 참조하려면 pub이 필요함
            pub fn add_to_waitlist() {}
        }
    
        // 중첩 struct를 참조할 때도 pub이 필요함
        pub struct Breakfast {
            // struct 내부 field는 기본 private이며 외부 접근에도 pub이 필요함
            pub toast: String,
            seasonal_fruit: String,
        }
    
        impl Breakfast {
            pub fn summer(toast: &str) -> Breakfast {
                Breakfast {
                    toast: String::from(toast),
                    seasonal_fruit: String::from("peaches"),
                }
            }
        }
    }
    
    pub fn eat_at_restaurant() {
        // Absolute path
        crate::front_of_house::hosting::add_to_waitlist();
    
        // Relative path
        front_of_house::hosting::add_to_waitlist();
    }
    
  • module과 use
    // C++의 using namespace와 유사함
    mod front_of_house {
        pub mod hosting {
            pub fn add_to_waitlist() {}
        }
    }
    use crate::front_of_house::hosting;
    pub fn eat_at_restaurant() {
        hosting::add_to_waitlist();
        hosting::add_to_waitlist();
        hosting::add_to_waitlist();
    }
    
    // use에 pub을 붙이는 것을 Re-exporting이라 하며 외부에서 hosting::xxx로 직접 사용 가능
    pub use crate::front_of_house::hosting;
    
    // use를 간소화할 수 있음
    use std::cmp::Ordering;
    use std::io;
    use std::{cmp::Ordering, io};
    
    // 간소화할 때 self를 사용할 수 있음
    use std::io;
    use std::io::Write;
    use std::io::{self, Write};
    
    // *로 모든 module을 가져올 수 있음
    use std::collections::*;
    

mod a;를 사용하면 같은 디렉터리의 a 폴더 또는 파일을 읽습니다.

출처

https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html

… package는 기능 집합을 제공하는 하나 이상의 crate입니다. package에는 해당 crate를 빌드하는 방법을 설명하는 Cargo.toml 파일이 들어 있습니다. package가 포함할 수 있는 내용을 정하는 규칙이 있습니다. package에는 library crate를 최대 하나만 포함할 수 있습니다. binary crate는 원하는 만큼 포함할 수 있지만, 적어도 하나의 crate(library 또는 binary)는 있어야 합니다. …

모듈을 여러 파일로 분리하기

지금까지 이 장의 모든 예제는 하나의 파일에 여러 모듈을 정의했습니다. 모듈이 커지면 코드를 탐색하기 쉽도록 정의를 별도의 파일로 옮기고 싶을 수 있습니다. 예를 들어 목록 7-17의 코드에서 시작해 crate 루트 파일을 목록 7-21의 코드가 들어가도록 바꾸고, front_of_house 모듈을 자체 파일 src/front_of_house.rs로 옮겨 보겠습니다. 이 경우 crate 루트 파일은 src/lib.rs이지만, crate 루트 파일이 src/main.rs인 binary crate에도 같은 절차를 적용할 수 있습니다. 파일 이름: src/lib.rs


mod front_of_house;

pub use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

목록 7-21: 본문이 src/front_of_house.rs에 들어갈 front_of_house 모듈 선언하기 그리고 src/front_of_house.rs에는 목록 7-22처럼 front_of_house 모듈 본문의 정의가 들어갑니다. 파일 이름: src/front_of_house.rs


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

목록 7-22: src/front_of_house.rs의 front_of_house 모듈 내부 정의 블록 대신 mod front_of_house 뒤에 세미콜론을 쓰면 Rust는 모듈과 같은 이름의 다른 파일에서 모듈 내용을 불러옵니다. 예제를 계속해 hosting 모듈도 별도 파일로 옮기려면 src/front_of_house.rs에 hosting 모듈 선언만 남깁니다: 파일 이름: src/front_of_house.rs


pub mod hosting;

그런 다음 src/front_of_house 디렉터리와 src/front_of_house/hosting.rs 파일을 만들고 hosting 모듈의 정의를 넣습니다: 파일 이름: src/front_of_house/hosting.rs


pub fn add_to_waitlist() {}

모듈 트리는 그대로이며 정의가 서로 다른 파일에 있어도 eat_at_restaurant의 함수 호출은 수정 없이 작동합니다. 이 방법을 사용하면 모듈이 커질 때 새 파일로 옮길 수 있습니다. src/lib.rs의 pub use crate::front_of_house::hosting 문도 바뀌지 않았습니다. use는 crate의 일부로 컴파일되는 파일에 영향을 주지 않습니다. mod 키워드는 모듈을 선언하고, Rust는 모듈과 같은 이름의 파일에서 해당 모듈에 들어갈 코드를 찾습니다.