[rust] crate / binary crate / library crate

About_work·2024년 5월 30일
0

rust

목록 보기
5/16

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 메소드를 정의하고, CircleSquare 구조체는 이 트레이트를 구현합니다.
  • 이렇게 함으로써, 다양한 타입들에 대해 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);
    }
}
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글