거대한 프로그램의 코드를 작성 할 때는 코드의 구조화가 중요해집니다. 코드에서 연관된 기능을 묶고 서로 다른 기능을 분리해두면 이후 특정 기능을 구현하는 코드를 찾거나 변경할 때 헤매지 않습니다. 한 패키지에는 여러 개의 바이너리 크레이트와 라이브러리 크레이트가 포함될 수 있으므로, 커진 프로젝트의 각 부분을 크레이트로 나눠서 외부 라이브러리 처럼 쓸 수 있습니다.
패키지와 크레이트
크레이트
크레이트는 러스트가 컴파일 한 차례에 고려하는 가장 작은 코드 단위 입니다. 크레이트는 바이너리일 수도 있고 라이브러리일 수도 있습니다. 바이너리 크레이트는 main 함수를 포함하고 실행파일이 실행되면 무슨일이 일어나야 하는지 정의한 파일입니다.
반대로 라이브러리 크레이트는 main함수를 가지지 않고 실행파일 형태로 컴파일 되지도 않습니다. 대신 여러 프로젝트에서 공용될 의도로 만들어진 기능들이 정의되어 있습니다.
패키지
패키지는 일련의 기능을 제공하는 하나 이상의 크레이트로 구성된 번들입니다. 패키지에는 이 크레이트들을 빌드하는 법이 설명된 Cargo.toml 파일이 포함되어 있습니다. 카고는 실제로 코드를 빌드하는 데 사용하는 커맨드 라인 도구의 바이너리 크레이트가 포함된 패키지입니다. 카고 패키디에는 이 바이너리 크레이트가 의존하고 있는 라이브러리 패키지도 포함되어 있습니다.
패키지에는 여러 개의 바이너리 크레이트를 원하는 만큼 추가할 수 있지만 라이브러리 크레이트는 하나만 넣을 수 있습니다.
모듈 정의와 사용
모듈은 향후 코드를 구조화 하는데에 쓰이는 기법 입니다. 주로 사용하는 키워드는 use 키워드와 공개여부를 제어하는 pub 키워드, as 키워드 등이 있습니다.
- mod : 새로운 모듈 선언
- pub : 기본적으로 함수, 타입, 상수, 모듈은 모두 private이기 때문에 pub을 사용해야함
- use : 모듈이나 묘듈내의 함수를 스코프 안으로 가져와 쉽게 참조
라이브러리 크레이트
라이브러리 크레이트는 다른 사람이 내가 만든 코드를 사용할 수 있게 즉 dependency에 추가할 수 있는 프로젝트를 의미합니다.
$ cargo new strong_lib --lib
$ cd strong_lib
그럼 cargo가 src/main.rs 대신 src/lib.rs 를 생성합니다. 코드도 src/main.rs 생성할 때 와는 조금 다릅니다
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
main이 없고 pub으로 선언된 함수와 테스트 함수만 존재할 뿐입니다. 이제 이 라이브러리를 외부에 배포하려면 cargo build를 사용해야 합니다
바이너리 크레이트
바이너리 크레이트는 실행가능한 프로그램을 생성하기 위한 크레이트 입니다. main 함수가 존재하며 파일의 시작점 역할을 합니다.
컴파일시 rustc는 이 바이너리 크레이트를 실행파일로 변환하여 실행가능하게 만들어줍니다
기본적으로 src/main.rs를 바이너리 크레이트 파일로 간주합니다.
다중 바이너리 크레이트
여러개의 바이너리 크레이트도 지원합니다.
my_project/
├── Cargo.toml
├── src/
│ └── main.rs // 기본 바이너리 크레이트
└── src/bin/
├── tool1.rs // 추가 바이너리 크레이트
└── tool2.rs // 또 다른 바이너리 크레이트
모듈 구현
모듈은 아래와 같은 형태로 구현할 수 있습니다. operations에서 실질적으로 사용할 로직을 구현합니다.
하위 구조를 보면 main.rs와, example.rs가 있는데 이는 math 도메인 내부와 외부의 접근 가능 여부를 확인하기 위함입니다.
src/
├── main.rs
└── math/
├── mod.rs
├── operations.rs
└── example.rs
자 여기서 main.rs는 operations에 접근하려면 별도의 공개 절차가 있어야 합니다.
아래는 operations.rs 파일의 코드 입니다. 단순히 두 매개변수를 더해주는 함수입니다.
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
이미 pub으로 공개 상태이지만 지금 상태는 math 폴더 내에서만 공개된 상태 입니다.
위에서 만든 example.rs에서는 operations::add 형태로 접근이 가능하겠지만 main.rs에서는 여전히 접근이 불가합니다.
mod.rs 파일을 보겠습니다. 여기서 다시 pub 키워드와 mod를 통해 공개중이라고 명시하고 있습니다.
이렇게 해야만 외부에서도 접근이 가능한 모듈이 만들어진겁니다,
pub mod operations; // operations 모듈 공개
'Rust' 카테고리의 다른 글
Rust 기본개념 - 패턴매칭 match (0) | 2024.12.09 |
---|---|
Rust 기본개념 - 열거형의 활용 (0) | 2024.12.09 |
Rust 기본개념 - 열거형 (0) | 2024.12.08 |
Rust 기본개념 - 메서드 (0) | 2024.12.07 |
Rust 기본 개념 - 구조체 (2) | 2024.12.07 |