코드 구성 배후의 개념 이해

완료됨

시작하기 전에 Rust 프로그램에서 코드 구성 배후의 개념을 설명하는 것이 중요합니다.

  • 패키지:
    • 하나 이상의 ‘크레이트’ 내에 기능을 포함합니다.
    • 해당 ‘크레이트’를 빌드하는 방법에 관한 정보를 포함합니다. 정보는 Cargo.toml 파일에 있습니다.
  • 크레이트:
    • Rust 컴파일러가 작동할 수 있는 가장 작은 양의 코드인 컴파일 단위입니다.
    • 컴파일이 완료되면 실행 파일이나 라이브러리를 생성합니다.
    • 이름 없는 암시적 최상위 모듈을 포함합니다.
  • 모듈:
    • 크레이트 내의 코드 구성 단위(중첩될 수 있음)입니다.
    • 추가 모듈을 포괄하는 재귀 정의를 포함할 수 있습니다.

패키지

$ cargo new <project-name> 명령을 실행할 때마다 Cargo는 패키지를 만듭니다.

$ cargo new my-project
     Created binary (application) `my-project` package

여기에는 src/main.rs만 포함하는 패키지가 있습니다. 즉, my-project라는 이진 크레이트만 포함합니다.

my-project
├── src
│  └── main.rs
└── Cargo.toml

패키지는 src/bin 디렉터리에 파일을 배치하여 여러 개의 이진 크레이트를 가질 수 있습니다. 각 파일은 별도의 이진 크레이트입니다.

패키지가 src/main.rssrc/lib.rs를 포함하는 경우 두 개의 크레이트, 즉 라이브러리와 이진 파일을 가지고 있는 것입니다. 둘 다 패키지와 동일한 이름을 갖습니다.

상자

Rust의 컴파일 모델은 이진 또는 라이브러리로 컴파일될 수 있는 크레이트라는 아티팩트를 중심으로 합니다.

cargo new 명령을 사용하여 만드는 모든 프로젝트는 크레이트 자체입니다. 프로젝트에서 종속성으로 사용할 수 있는 모든 제3자 Rust 코드도 각각 단일 크레이트입니다.

라이브러리 크레이트

이진 프로그램을 만드는 방법에 대해서는 이미 살펴보았습니다. 라이브러리를 만드는 것은 간단합니다. 라이브러리를 만들려면 cargo new 명령에 --lib 명령줄 매개 변수를 전달합니다.

$ cargo new --lib my-library
     Created library `my-library` package

src/main.rs 파일 대신 이것이 표시되며, 이제 =src/lib.rs' 파일을 얻게 됩니다.

my-library
├── src
│  └── lib.rs
└── Cargo.toml

이 크레이트를 컴파일하도록 Cargo에 지시하면, 게시하고 다른 프로젝트에 연결할 수 있는 libmy_library.rlib라는 라이브러리 파일이 생성됩니다.

모듈

Rust는 가독성을 높이고 다시 사용하기 쉬운 논리적 단위로 코드를 계층적으로 분할하는 데 사용할 수 있는 강력한 모듈 시스템을 제공합니다.

모듈은 항목 컬렉션입니다.

  • 상수
  • 형식 별칭
  • Functions
  • 구조체
  • 열거형
  • 특성
  • impl 블록
  • 기타 모듈

모듈은 항목 ‘프라이버시’도 제어합니다. 항목 프라이버시는 항목을 ‘퍼블릭’ 또는 ‘프라이빗’으로 식별합니다. 퍼블릭은 외부 코드에서 항목을 사용할 수 있음을 의미합니다. 프라이빗은 항목이 내부 구현 세부 정보이며 외부에서 사용할 수 없음을 의미합니다.

모듈의 예는 다음과 같습니다.

mod math {
    type Complex = (f64, f64);
    pub fn sin(f: f64) -> f64 { /* ... */ }
    pub fn cos(f: f64) -> f64 { /* ... */ }
    pub fn tan(f: f64) -> f64 { /* ... */ }
}

println!("{}", math::cos(45.0));

소스 파일에 mod 선언이 있는 경우, 컴파일러를 실행하기 전에 소스 파일의 mod 선언이 있는 위치에 모듈 파일의 내용이 삽입됩니다. 즉, 모듈은 개별적으로 컴파일되지 않으며 크레이트만 컴파일됩니다.

math 모듈에서 함수 정의의 시작 부분에 pub 키워드가 있음을 이미 파악했을 것입니다.

Rust 컴파일러는 모듈에서 항목을 사용할 수 있는지를 확인합니다. 기본적으로 Rust의 모든 항목은 프라이빗이며 현재의 모듈 및 해당 하위 항목에서만 액세스할 수 있습니다. 반면, 항목이 pub으로 선언되는 경우 외부에서 액세스할 수 있는 것으로 간주할 수 있습니다. 예를 들면 다음과 같습니다.

// Declare a private struct
struct Foo;

// Declare a public struct with a private field
pub struct Bar {
    field: i32,
}

// Declare a public enum with two public variants
pub enum State {
    PubliclyAccessibleVariant,
    PubliclyAccessibleVariant2,
}

Rust의 개인 정보 규칙은 내부 구현 세부 정보를 숨기는 동시에 퍼블릭 API를 노출하는 모듈 계층 구조를 만드는 데에서 매우 강력합니다.