IMCAT.DEV
로그인 가입
Rust 중급 자료구조

Rust 열거형 (Enums)

Rust 열거형 (Enums) — 중급

열거형 (Enums)

1. 도입 (왜 배워야 하는가)

열거형(Enums)은 Rust 프로그래밍에서 매우 중요한 기능입니다. 실무에서 복잡한 데이터 유형을 간결하고 명확하게 다룰 수 있게 해주기 때문에, 특히 다양한 상태나 옵션을 표현할 때 큰 도움이 됩니다. 예를 들어, 쇼핑몰의 주문 상태(주문 대기, 결제 완료, 배송 중 등)를 표현할 때 열거형을 사용하면 코드가 더 가독성이 높아지고 안전하게 됩니다.

만약 열거형을 사용하지 않는다면, 문자열이나 숫자로 상태를 표현해야 할 것이고, 이는 코드의 가독성을 떨어뜨리고 안정성을 해칠 수 있습니다. 잘못된 문자열을 사용하거나, 상태를 놓치는 등의 오류가 발생할 가능성이 커집니다. 따라서 열거형을 이해하고 활용하는 것은 Rust 프로그래머에게 필수적입니다.

2. 핵심 개념 설명

열거형은 관련된 값의 집합을 정의하는데 사용됩니다. 각 값은 고유한 이름을 가지며, 다양한 형태(variant)를 가질 수 있습니다.

비유적으로 설명하자면, 열거형은 '메뉴판'과 같습니다. 메뉴판에는 여러 요리(값)가 나열되어 있으며, 고객은 그 중 하나를 선택할 수 있습니다. 각 요리는 다양한 재료와 조리 방법이 있지만, 고객이 선택할 수 있는 것은 메뉴에 있는 요리뿐입니다.

관련 용어 정리

용어설명
Variant열거형의 각 요소를 의미합니다.
Enum열거형의 전체 구조를 의미합니다.
Pattern Matching열거형의 값을 처리하는 방법입니다.

3. 기본 코드 예제

아래는 가장 기본적인 열거형 사용법을 보여주는 코드입니다.

enum OrderStatus {
    Pending,
    Paid,
    Shipped,
}

fn print_order_status(status: OrderStatus) {
    match status {
        OrderStatus::Pending => println!("주문 대기 중입니다."),
        OrderStatus::Paid => println!("결제가 완료되었습니다."),
        OrderStatus::Shipped => println!("배송 중입니다."),
    }
}

fn main() {
    let my_order = OrderStatus::Paid;
    print_order_status(my_order);
}

실행 결과

결제가 완료되었습니다.

코드 한 줄씩 동작 설명

  1. enum OrderStatus { ... }: OrderStatus라는 이름의 열거형을 정의합니다. 세 가지 변형(Pending, Paid, Shipped)을 가집니다.
  2. fn print_order_status(status: OrderStatus) { ... }: OrderStatus 타입을 인자로 받아 상태에 따른 메시지를 출력하는 함수를 정의합니다.
  3. match status { ... }: status의 변형에 따라 다른 메시지를 출력하는 패턴 매칭을 수행합니다.
  4. let my_order = OrderStatus::Paid;: OrderStatus의 변형 중 Paid를 선택하여 my_order에 저장합니다.
  5. print_order_status(my_order);: my_order의 상태를 출력합니다.
  6. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니

    쇼핑몰에서 장바구니에 담긴 상품의 상태를 관리할 때 열거형을 사용할 수 있습니다.

    enum CartItemStatus {
        InStock,
        OutOfStock,
        PreOrder,
    }
    
    fn check_item_status(item: CartItemStatus) {
        match item {
            CartItemStatus::InStock => println!("상품이 재고 있습니다."),
            CartItemStatus::OutOfStock => println!("상품이 품절입니다."),
            CartItemStatus::PreOrder => println!("상품이 사전 주문 가능합니다."),
        }
    }

    예제 2: 게임 캐릭터 상태

    게임에서 캐릭터의 상태를 표현하기 위해 열거형을 사용할 수 있습니다.

    enum CharacterState {
        Idle,
        Walking,
        Running,
        Attacking,
    }
    
    fn describe_character_state(state: CharacterState) {
        match state {
            CharacterState::Idle => println!("캐릭터가 대기 중입니다."),
            CharacterState::Walking => println!("캐릭터가 걷고 있습니다."),
            CharacterState::Running => println!("캐릭터가 달리고 있습니다."),
            CharacterState::Attacking => println!("캐릭터가 공격 중입니다."),
        }
    }

    5. 흔한 실수와 주의사항

    실수 1: 패턴 매칭을 안 할 경우

    fn print_status(status: OrderStatus) {
        // match를 하지 않으면 컴파일 오류가 발생합니다.
        // println!("{:?}", status);
    }

    올바른 코드

    fn print_status(status: OrderStatus) {
        match status {
            OrderStatus::Pending => println!("대기 중"),
            _ => (),
        }
    }

    실수 2: 열거형의 변형을 잘못 사용

    let invalid_order = OrderStatus::Canceled; // Canceled는 정의되지 않음

    올바른 코드

    enum OrderStatus {
        Pending,
        Paid,
        Shipped,
        Canceled, // 추가로 정의
    }

    6. 정리

    • 열거형은 관련된 데이터의 집합을 정의하는 데 매우 유용하다.
    • 패턴 매칭을 통해 열거형의 값을 안전하게 처리할 수 있다.
    • 실생활에서 다양한 상태나 옵션을 표현할 때 사용된다.
    • 다음에 학습하면 좋은 주제

    • 구조체(Structs)와 열거형의 결합
    • 트레이트(Traits)와 열거형의 상호작용
    • Rust의 에러 처리 패턴 (Result와 Option)