모듈(Module), 패키지(Package), 그리고 use 키워드

Rust 프로젝트가 커지면 코드 구조를 깔끔하게 나누는 것이 중요합니다. 따라서, 모듈과 패키지, 그리고 패키지와 크레이트의 개념에 대해서 살펴보고, pub 키워드, 하위 모듈, 파일과 모듈 연동, use 키워드에 대해서도 알아보겠습니다.


1. 모듈(Module)

  • Rust에서 모듈은 코드를 그룹화하는 단위입니다.
  • 파일이나 폴더 단위로 구성할 수 있습니다.
mod greetings {
    pub fn hello() {
        println!("안녕하세요!");
    }
}

fn main() {
    greetings::hello();
}
  • mod 키워드로 모듈을 선언합니다.
  • 함수, 변수 등을 외부에서 사용하려면 pub으로 공개(public)해야합니다.
  • main 함수에서 greetings 모듈의 hello 함수를 사용하려면 ::을 이용해서 모듈명::함수명으로 선언해야 합니다. 따라서, greetings::hello();가 됐습니다.
  • 위 코드를 실행하면 greetings 모듈의 hello 함수가 실행되어
    “안녕하세요!”가 화면에 출력됩니다.
  • fn hello() 앞의 pub를 지우고 실행하면
    hello 함수가 private라는 에러 메시지가 표시됩니다. private이기 때문에 main함수에서 불러서 사용할 수가 없는 것입니다.

2. 하위 모듈

mod greetings {
    pub mod english {
        pub fn hello() {
            println!("Hello!");
        }
    }
}

fn main() {
    greetings::english::hello();
}
  • 모듈 내에 또 다른 모듈을 정의할 수 있음
    위 코드를 보면 greetings안에 english 모듈이 있고, 그 안에 hello 함수가 있습니다.
  • 따라서, main함수에서 불러서 사용할 수 있도록 맨 위 module에만 pub이 없고, 그 안 module에는 pub이 추가되어 있고, hello 함수에 pub이 붙어 있는 것은 위와 같습니다.
  • 또한 mod 안의 mod 안에 hello 함수가 있으므로 ::을 두번 써서, greetings::english::hello();라고 함수를 호출하고 있습니다.
  • 위 코드를 실행하면 “Hello!”라고 화면에 출력됩니다.


3. 파일과 모듈 연동

  • mod로 선언한 모듈은 같은 src 폴더 내에 다른 rs 파일로 분리 가능
src/
 ├── main.rs   // 메인 파일
 └── greetings.rs  // greetings 모듈

(greetings.rs)

pub fn hello() {
    println!("안녕하세요!");
}
  • rs 파일명이 greetings이므로 파일명이 module이 돼서, greetings.rs 파일 안에는 mod 선언이 불필요하며, 함수는 공개되어야 하므로 pub를 앞에 붙여야 하고, println! 문의 내용은 같습니다.

(main.rs)

mod greetings;

fn main() {
    greetings::hello();
}
  • main.rs에서 main 함수 안이 아니라 밖에 greetings module을 불러오기 위해 mod greetings;라고 선언해야 하며, 모듈명::함수명으로 함수를 실행하는 것은 동일합니다.
  • 실행 결과는 “안녕하세요!”라고 동일합니다.
  • 아래와 같이 mod greetings;를 main함수의 아래에 배치해도 실행에 문제가 없습니다.
fn main() {
    greetings::hello();
}

mod greetings;

4. 패키지와 크레이트(Crate)

  • 패키지: 패키지는 크레이트들을 관리하고 빌드, 테스트, 배포하는 역할을 합니다. 패키지 안에는 여러 개의 바이너리 크레이트가 있을 수 있지만, 라이브러리 크레이트는 하나만 포함할 수 있습니다.
    cargo new my_project 명령으로 패키지를 생성하면, Cargo.toml 파일과 src 디렉토리가 생성되는데, src 디렉토리에는 크레이트의 소스 코드가 위치합니다. 
    Cargo.toml에서 패키지를 설정합니다.

  • 크레이트: 크레이트는 라이브러리 또는 실행 가능한 바이너리 코드를 제공하는 모듈 트리입니다. 크레이트는 모듈 시스템을 통해 코드 구조를 관리하고, 기능을 캡슐화하며, 다른 프로젝트에서 재사용될 수 있도록 합니다. 
바이너리 크레이트: 실행 가능한 바이너리 파일로 컴파일되는 크레이트입니다. main 함수를 포함하며, 실행 시 프로그램의 시작점이 됩니다. src/main.rs 파일이 바이너리 크레이트의 루트 역할을 합니다.
라이브러리 크레이트: 다른 프로젝트에서 재사용할 수 있는 코드 모음입니다. main 함수를 포함하지 않으며, 실행 파일로 컴파일되지 않습니다. src/lib.rs 파일이 라이브러리 크레이트의 루트 역할을 합니다.

5. use 키워드

  • 긴 경로를 간단히 하거나 외부 모듈을 가져올 때 사용
mod greetings {
    pub fn hello() {
        println!("안녕하세요!");
    }
}

use greetings::hello;

fn main() {
    hello();
}
  • main 함수 안에 greetings::hello();라고 표기해야 하지만,
    use greetings::hello;라고 main 함수의 밖에서 선언하면, hello();라고만 써서 함수를 간단하게 사용할 수 있습니다. hello는 중복되는 것을 주의해야 합니다.
  • 별칭(alias) 지정도 가능
use greetings::hello as say_hello;

fn main() {
    say_hello();
}
  • 별칭을 지정하면 별칭으로 함수명을 사용하면 됩니다.
  • mod와 use 키워드를 함께 사용 가능합니다.
    아래와 같이 mod greetings;로 greetins.rs 파일을 불러들인 후 use 키워드를 사용해 함수를 호출 할 수 있습니다.

mod greetings;
use greetings::hello as say_hello;


6. 요약

개념설명
mod모듈 선언, 코드 그룹화
pub공개 키워드, 외부 접근 허용(cf. private)
파일 분리mod greetings;와 greetings.rs
패키지/크레이트프로젝트 단위, 컴파일 단위
use모듈 경로 단축 및 별칭 지정

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다