Rust 구조체 유형 및 활용 탐구

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Rust 프로그래밍 언어의 구조체 (structure) 를 탐구해 보겠습니다. struct 키워드를 사용하여 생성할 수 있는 구조체는 튜플 구조체 (tuple struct), 클래식 C 구조체 (classic C struct), 그리고 유닛 구조체 (unit struct) 의 세 가지 유형이 있습니다. 튜플 구조체는 본질적으로 명명된 튜플이며, C 구조체는 C 프로그래밍에서 발견되는 전통적인 구조체이고, 유닛 구조체는 필드가 없으며 제네릭 (generics) 에 유용합니다. nameage 필드를 가진 Person과 같이 여러 필드를 가진 구조체를 정의할 수 있습니다. 또한, 구조체는 다른 구조체의 필드로 재사용될 수 있습니다. 예를 들어, 왼쪽 상단과 오른쪽 하단 모서리를 나타내는 두 개의 Point 구조체로 구성된 Rectangle의 예시를 볼 수 있습니다. 필드 초기화 축약 (field init shorthand) 을 사용하여 구조체를 초기화하고, 점 표기법 (dot notation) 을 사용하여 해당 필드에 접근할 수 있습니다. let 바인딩을 사용하여 구조체를 분해 (destructure) 하는 것도 가능합니다. 또한, 이 랩에서는 두 가지 활동을 제공합니다. 중첩 분해 (nested destructuring) 를 사용하여 Rectangle의 면적을 계산하는 함수 rect_area를 생성하고, Pointf32를 인수로 받아 해당 지점에 왼쪽 상단 모서리가 있고 너비와 높이가 f32에 해당하는 Rectangle을 반환하는 함수 square를 생성하는 것입니다.

참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어, main.rs를 사용하고 rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.

구조체 (Structures)

struct 키워드를 사용하여 생성할 수 있는 구조체는 세 가지 유형이 있습니다.

  • 튜플 구조체 (Tuple structs): 기본적으로 명명된 튜플입니다.
  • 클래식 C 구조체 (classic C structs)
  • 유닛 구조체 (Unit structs): 필드가 없으며 제네릭 (generics) 에 유용합니다.
// 사용하지 않는 코드에 대한 경고를 숨기는 속성입니다.
#![allow(dead_code)]

#[derive(Debug)]
struct Person {
    name: String,
    age: u8,
}

// 유닛 구조체
struct Unit;

// 튜플 구조체
struct Pair(i32, f32);

// 두 개의 필드를 가진 구조체
struct Point {
    x: f32,
    y: f32,
}

// 구조체는 다른 구조체의 필드로 재사용될 수 있습니다.
struct Rectangle {
    // 사각형은 공간에서 왼쪽 상단과 오른쪽 하단 모서리가 어디에 있는지 지정하여 정의할 수 있습니다.
    top_left: Point,
    bottom_right: Point,
}

fn main() {
    // 필드 초기화 축약 (field init shorthand) 으로 구조체 생성
    let name = String::from("Peter");
    let age = 27;
    let peter = Person { name, age };

    // 디버그 구조체 출력
    println!("{:?}", peter);

    // `Point` 인스턴스화
    let point: Point = Point { x: 10.3, y: 0.4 };

    // point 의 필드에 접근
    println!("point coordinates: ({}, {})", point.x, point.y);

    // 다른 point 의 필드를 사용하여 구조체 업데이트 구문을 사용하여 새로운 point 를 만듭니다.
    let bottom_right = Point { x: 5.2, ..point };

    // `bottom_right.y` 는 `point.y` 와 동일합니다. 왜냐하면 `point` 에서 해당 필드를 사용했기 때문입니다.
    println!("second point: ({}, {})", bottom_right.x, bottom_right.y);

    // `let` 바인딩을 사용하여 point 를 분해 (destructure) 합니다.
    let Point { x: left_edge, y: top_edge } = point;

    let _rectangle = Rectangle {
        // 구조체 인스턴스화도 표현식입니다.
        top_left: Point { x: left_edge, y: top_edge },
        bottom_right: bottom_right,
    };

    // 유닛 구조체 인스턴스화
    let _unit = Unit;

    // 튜플 구조체 인스턴스화
    let pair = Pair(1, 0.1);

    // 튜플 구조체의 필드에 접근
    println!("pair contains {:?} and {:?}", pair.0, pair.1);

    // 튜플 구조체 분해
    let Pair(integer, decimal) = pair;

    println!("pair contains {:?} and {:?}", integer, decimal);
}

활동 (Activity)

  1. Rectangle의 면적을 계산하는 함수 rect_area를 추가합니다 (중첩 분해 (nested destructuring) 를 사용해 보세요).
  2. Pointf32를 인수로 받아 왼쪽 상단 모서리가 해당 지점에 있고 너비와 높이가 f32에 해당하는 Rectangle을 반환하는 함수 square를 추가합니다.

요약

축하합니다! 구조체 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.