0. 들어가기 전에
요약
- Crate: Rust 코드의 모듈이 모여 있는 컴파일 단위.
- Binary Crate: 실행 가능한 프로그램을 생성하는 크레이트.
- Library Crate: 재사용 가능한 코드를 제공하는 크레이트.
이렇게 Rust는 크레이트 시스템을 통해 코드의 재사용성과 모듈성을 증대시키며, 개발자가 더 효율적으로 소프트웨어를 개발하고 관리할 수 있도록 돕습니다.
모듈과 패스
- Rust에서 "모듈"과 "패스"는 코드를 구조화하고 조직하는 데 사용되는 개념들
- 이 두 개념은 크레이트 내부의 코드를 체계적으로 관리하는 데 중요한 역할을 합니다.
- 이러한 모듈과 패스 시스템은 Rust에서
- 코드를 논리적으로 구성하고,
- 캡슐화와 재사용성을 향상시키며,
- 이름 충돌을 방지하는 데 도움을 줍니다.
- 이를 통해 대규모 프로젝트에서도 코드의 관리가 용이해집니다.
모듈 (Modules)
- 모듈은
Rust 코드의 네임스페이스를 형성하는 기본적인 구성 단위
모듈을 사용하면 관련된 기능이나 데이터를 그룹화하고, 코드의 가독성을 높이며, 재사용을 촉진
- 각 모듈은
함수, 구조체, 트레이트, 상수 등을 포함
할 수 있으며, 다른 모듈로부터도 접근할 수 있습니다.
- 예를 들어, 수학적 연산을 처리하는 함수들을
math
라는 모듈 안에 정의할 수 있습니다.
- 이를 통해
math
모듈 안의 함수들은 math::add()
, math::subtract()
등과 같이 접근할 수 있게 됩니다.
패스 (Paths)
- 패스는 Rust에서 특정 아이템(예: 함수, 구조체, 모듈 등)에 접근하기 위한 방법을 제공
- 패스는 크게 두 가지 유형이 있습니다: 상대 패스와 절대 패스.
- 상대 패스:
- 현재 모듈에서 시작하여 다른 아이템을 찾을 때 사용
- 예를 들어, 같은 모듈 안의 다른 함수를 호출할 때
self::function_name()
형태로 사용할 수 있음
- 절대 패스:
- 크레이트의 루트에서 시작하여 특정 아이템을 찾을 때 사용
- 예를 들어, 크레이트의 루트에 있는
math
모듈의 add
함수를 호출하고 싶다면 crate::math::add()
형태로 사용할 수 있습니다.
1. 개념
- Rust에서 "crate"는 기본적으로 패키지의 개념
- 크레이트(crate)는 Rust 코드의 모듈이 모여 있는 컴파일 단위
- 크게 두 종류로 나뉩니다:
- 바이너리 크레이트(binary crate)와 라이브러리 크레이트(library crate).
1. Crate (크레이트)
- 크레이트는 Rust 코드가 컴파일되어 실행 파일이나 라이브러리로 만들어지는 단위
- 각 크레이트는 하나의 목적으로 구성되며,
크레이트 내의 코드는 모듈과 패스를 사용하여 조직
2. Binary Crate (바이너리 크레이트)
- 바이너리 크레이트는 실행 가능한 프로그램을 생성
- 이 크레이트는
main
함수를 포함하고 있으며, 이 함수가 프로그램의 시작점 역할
- 컴파일 시 Rust 컴파일러는 이 바이너리 크레이트를 실행 파일로 변환하여, 사용자가 실행할 수 있게 만듭니다.
- 예를 들어, 명령줄 도구나 어플리케이션 같은 것들이 바이너리 크레이트를 사용하여 만들어집니다.
3. Library Crate (라이브러리 크레이트)
- 라이브러리 크레이트는 재사용 가능한 코드의 집합을 제공합니다.
- 이 크레이트는
main
함수를 포함하지 않으며, 다른 프로그램이나 크레이트에서 호출하여 사용할 수 있는 함수, 타입, 트레이트 등을 정의
- 라이브러리 크레이트는 일반적으로 API 형태로 제공되며, 다른 개발자들이 그 기능을 사용할 수 있도록 합니다.
- 예를 들어, 수학 연산을 수행하거나 파일을 다루는 기능 등을 라이브러리 크레이트로 제공할 수 있습니다.
2. crate VS module vs trait
- 크레이트는 프로젝트의 전체 코드를 담고 있으며,
- 모듈은 이 코드를 내부적으로 조직화하는 역할을 하고,
- 트레이트는
타입 간의 공통 인터페이스를 정의
1. Crate (크레이트)
- 크레이트는 Rust에서 코드를 패키지화하는 가장 큰 단위입니다.
- 크레이트는 컴파일된 프로그램이나 라이브러리 자체가 될 수 있습니다.
- 각 크레이트는 자체적으로 컴파일되며, Rust 프로젝트를 시작할 때 기본적으로 하나의 크레이트로 시작합니다.
- 크레이트는 모든 코드와 리소스를 포함하고, 라이브러리 형태로 다른 프로젝트에서 사용될 수도 있습니다.
- Binary Crate:
- 실행 가능한 프로그램을 생성합니다.
main.rs
가 기본적인 진입점입니다.
- Library Crate:
- 재사용 가능한 코드의 모음으로, 다른 크레이트에서 사용될 수 있습니다.
lib.rs
가 주요 진입점입니다.
2. Module (모듈)
- 모듈은 크레이트 내의 코드를 조직하는 단위입니다.
- 모듈을 사용하면 함수, 구조체, 트레이트, 상수 등을 그룹화
- 모듈은 코드의 접근성을 제어하는 데도 사용되며,
pub
키워드를 사용하여 외부에서 접근 가능하게 만들 수 있습니다.
- 모듈 시스템은 네임스페이스를 제공하므로 코드 내에서 이름 충돌을 방지할 수 있습니다.
3. Trait (트레이트)
- 트레이트는 Rust에서
인터페이스와 유사한 개념
으로, 어떤 타입이 가져야 할 기능을 정의
- 트레이트를 통해 다른 타입들에 대해 공통된 동작을 요구할 수 있으며, 다형성을 구현하는 데 사용됩니다.
- 트레이트는 메소드를 정의할 수 있으며, 다른 타입들이 이 트레이트를 구현하면, 해당 메소드들을 제공해야 합니다.
- 이를 통해 다양한 타입들을 유연하게 다룰 수 있습니다.
- 아래 예에서,
Drawable
트레이트는 draw
메소드를 정의하고, Circle
과 Square
구조체는 이 트레이트를 구현합니다.
- 이렇게 함으로써, 다양한 타입들에 대해
draw
메소드를 일관된 방식으로 호출할 수 있습니다.
trait Drawable {
fn draw(&self);
}
struct Circle {
radius: f64,
}
struct Square {
side: f64,
}
impl Drawable for Circle {
fn draw(&self) {
println!("Circle with radius {}", self.radius);
}
}
impl Drawable for Square {
fn draw(&self) {
println!("Square with side {}", self.side);
}
}