Rust - chapter 7(모듈)


공식 문서 - 번역글의 7번째 챕터 정리
'Hello world!' 같은 간단한 동작은 한 파일로 작성할 수 있지만 코드 규모가 커질 경우 재사용성과 조직화를 위해서 기준대로 코드를 분리하게 되고 러스트는 분리된 코드들을 사용할 수 있는 모듈 시스템을 가지고 있다.

mod

모듈 예제를 작성하기 위해서 라이브러리 크레이트를 먼저 만들면 평상시 생기는 main.rs 가 아닌 lib.rs 파일이 생성되는 것을 볼 수 있다.
이러한 라이브러리 크레이틑 실행할 것이 없으므로 컴파일을 할 때 cargo build 를 사용하자.

cargo new hello-world --lib

먼저 모듈을 정의할 때는 mod 키워드를 사용하고 :: 을 사용하여 호출할 수 있다. 현재 network 안에 client 이 있는데 이런 부분들을 파일로 분리할 수 있다.

mod network {
    fn connect() {
        println!("Network Connecting...");
    }

    mod client {
        fn connect() {
          println!("Client Connecting...");
        }
    }
}


network::connect();
network::client::connect();

모듈들을 분리할 경우 파일시스템을 이용하여 폴더와 파일명으로 모듈을 분리할 수 있다.
같은 레벨에 있는 모듈의 경우 client.rs 와 같이 해당하는 모듈의 이름으로 파일을 작성하면 되며, 해당 모듈 안에 있는 모듈을 다시 분리하고자 한다면 network 와 같이 디렉토리를 만들고 network 의 내용은 mod.rsnetwork 모듈 안에 있는 server 모듈을 다시 파일로 만들어 옮겨주면 된다.

src
├── client.rs
├── lib.rs
└── network
    ├── mod.rs
    └── server.rs

pub

extern crate 모듈명; 을 통해 만들어진 라이브러리 크레이트를 가져올 수 있다. 아래와 같은 코드에서는 private 모듈이라는 에러가 발생하게 될 텐데 모듈을 pub 을 넣어주지 않을 경우 private 하여 외부에서 사용할 수 없기 때문이다.
외부에서 사용하고자 하는 모듈과 함수는 pub 키워드를 사용해주어야 한다.

extern crate communicator;

fn main() {
    communicator::client::connect();
}

// src/lib.rs
pub mod client;
pub mod network;

use

use 를 통해서도 간결하게 가져와서 사용할 수 있다.

pub mod a {
    pub mod series {
        pub mod of {
            pub fn nested_modules() {}
        }
    }
}
enum TrafficLight {
    Red,
    Yellow,
    Green,
}

// 전체 가져오기
// use TrafficLight::*;
use TrafficLight::{Red, Yellow};
use a::series::of;

fn main() {
    of::nested_modules();
    let red = Red;
    let yellow = Yellow;
    let green = TrafficLight::Green;
}

super

super 키워드를 통해서 부모 모듈로 거슬러 올라 갈 수 있다.

#[cfg(test)]
mod tests {
    use super::client;

    #[test]
    fn it_works() {
        client::connect();
    }
}

개인이 참고하고자 작성한 글이며, 잘못된 정보가 있을 수 있습니다. 잘못된 정보는 메일로 보내주시면 감사하겠습니다. 🙏