Rust 튜토리얼 목차

Struct and Enum

구조체 (Struct)

구조체는 struct 키워드를 사용하여 정의하며, 이름과 중괄호로 묶인 명명된 필드 집합이 뒤따릅니다.

다음은 Person 구조체의 예입니다:

struct Person {
  name: String,
  age: u8,
}

구조체의 인스턴스를 생성하려면, 구조체 이름 뒤에 중괄호를 사용하고 필드에 값을 할당합니다.
예를 들면:

let person = Person { name: String::from("Alice"), age: 30 };

열거형 (Enum)

열거형(enum, "enumeration"의 줄임말)은 고정된 명명된 값 집합인 "변종(variants)"을 가진 타입을 나타냅니다.

열거형을 정의하려면, enum 키워드를 사용하고 이름과 중괄호로 묶인 명명된 변종 집합이 뒤따릅니다.

다음은 Status 열거형의 예입니다:

enum Status {
  Active,
  Inactive,
  Pending,
}

열거형의 인스턴스를 생성하려면, 열거형 이름 뒤에 두 개의 콜론(::)과 변종 이름을 사용합니다.

예를 들면:

let status = Status::Active;

열거형 변종에 따라 다른 작업을 수행하려면 match 표현식을 사용할 수 있습니다:

let user_status = Status::Active;

열거형을 다루려면, 종종 match 표현식을 사용하며, 이를 통해 열거형 변종에 따라 다른 작업을 수행할 수 있습니다:

fn print_status_message(status: Status) {
    match status {
        Status::Active => println!("사용자가 활성 상태입니다."),
        Status::Inactive => println!("사용자가 비활성 상태입니다."),
        Status::Pending => println!("사용자가 보류 중입니다."),
    }
}
fn main() {
    let user_status = Status::Active;
    print_status_message(user_status);
}

Tuple Struct, Enum

주로 간결한 표현, 타입 안전성 및 논리적 구조를 위해 사용됩니다.

// 튜플 구조체 (Tuple Struct)
struct Point3D(f32, f32, f32);

// 열거형에 튜플 변종 (Tuple Enum Variant) 포함
enum Shape {
    Circle(f32),
    Rectangle(f32, f32),
}

fn main() {
    let point = Point3D(1.0, 2.0, 3.0);
    let circle = Shape::Circle(5.0);
    let rectangle = Shape::Rectangle(4.0, 6.0);

    // 튜플 구조체의 값에 접근
    println!("x 좌표: {}", point.0);
    println!("y 좌표: {}", point.1);
    println!("z 좌표: {}", point.2);

    // 튜플 열거형 변종의 값에 접근
    match circle {
        Shape::Circle(radius) => println!("원의 반지름: {}", radius),
        _ => (),
    }
}

Nested
중첩된 Struct과 Enum을 만들고 싶다면?

// 중첩된 구조체 (Nested Struct)
struct Address {
    street: String,
    city: String,
}

struct Person {
    name: String,
    address: Address,
}
// 중첩된 열거형 (Nested Enum)
enum Animal {
    Mammal {
        species: String,
        is_domestic: bool,
    },
    Reptile {
        species: String,
        is_poisonous: bool,
    },
}

fn main() {
    let person = Person {
        name: String::from("지훈"),
        address: Address {
            street: String::from("서울로"),
            city: String::from("서울"),
        },
    };
    let dog = Animal::Mammal {
        species: String::from("개"),
        is_domestic: true,
    };
}