Menu
Coddy logo textTech

데이터를 포함한 Enum

Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 14번째.

Rust의 기본적인 열거형(enum)은 Direction::North 또는 Status::Active와 같이 고정된 변체(variant) 집합을 가진 타입을 정의할 수 있게 해줍니다. 하지만 Rust의 열거형은 그보다 훨씬 더 강력합니다. 각 변체는 자체적인 데이터를 가질 수 있으며, 이는 열거형을 실제 시나리오를 모델링하는 데 매우 유연하게 만들어 줍니다.

서로 다른 메시지 유형이 서로 다른 정보를 전달하는 메시징 시스템을 생각해 보세요. 텍스트 메시지에는 내용이 있고, 이동 명령에는 좌표가 있으며, 종료 신호에는 아무것도 없습니다. Rust에서는 이 모든 것을 단일 열거형(enum)으로 표현할 수 있습니다:

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(u8, u8, u8),
}

각 배리언트는 서로 다른 형태를 가집니다. Quit은 데이터를 보유하지 않으며, 단지 신호일 뿐입니다.

Move는 이름이 지정된 필드가 있는 구조체와 유사한 구문을 사용합니다. Write는 튜플 구문을 사용하여 단일 String을 보유합니다. ChangeColor는 RGB 구성 요소를 나타내는 세 개의 값을 보유합니다.

이러한 변형의 인스턴스를 생성하는 방법은 다음과 같습니다:

let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("Hello"));
let m4 = Message::ChangeColor(255, 128, 0);

이 접근 방식의 장점은 m1, m2, m3, m4가 모두 동일한 타입인 Message라는 점입니다. 이들을 동일한 컬렉션에 저장하거나, 동일한 함수에 전달하거나, 단일 함수에서 어떤 변형(variant)이든 반환할 수 있습니다. 열거형(enum)은 각 변형이 필요로 하는 특정 정보를 보존하면서 서로 다른 데이터 형태를 하나의 타입으로 통합합니다.

challenge icon

챌린지

쉬움

서로 다른 유형의 알림을 표현하기 위해 데이터를 포함하는 열거형(enum)을 사용하는 알림 시스템을 구축해 보겠습니다. 각 알림 유형은 서로 다른 정보를 전달합니다. 어떤 것은 메시지를 포함하고, 어떤 것은 숫자 값을 가지며, 어떤 것은 단순한 신호입니다.

코드를 정리하기 위해 두 개의 파일을 생성합니다:

  • notification.rs: 세 가지 변리언트(variant)를 가진 공개(public) Notification 열거형을 정의합니다:
    • Alert — 단일 String 메시지를 보유 (튜플 구문)
    • Reminder — 이름이 있는 필드 보유: title (String) 및 minutes (u32)
    • Dismiss — 데이터를 보유하지 않는 단순 신호
  • main.rs: notification 모듈을 가져와 각 변리언트의 인스턴스를 하나씩 생성합니다. 그런 다음 각 알림에 대한 정보를 출력하여 세 가지 변리언트가 모두 동일한 타입이지만 서로 다른 데이터를 전달함을 보여줍니다.

출력할 때는 디버그 포매팅({:?})을 사용하여 각 알림을 표시합니다. 이 방식으로 출력할 수 있도록 열거형에 Debug 트레이트를 파생(derive)시켜야 합니다.

출력 결과는 세 가지 알림을 각각 별도의 줄에 표시해야 합니다:

Alert("{message}")
Reminder { title: "{title}", minutes: {minutes} }
Dismiss

예를 들어, 알림 메시지가 "Server down"이고, 제목이 "Meeting"이며 30분인 미리 알림의 경우 출력은 다음과 같습니다:

Alert("Server down")
Reminder { title: "Meeting", minutes: 30 }
Dismiss

알림 메시지, 미리 알림 제목, 미리 알림 시간(분)의 세 가지 입력을 받게 됩니다.

치트 시트

Rust의 열거형(Enum) 변형은 서로 다른 유형의 데이터를 가질 수 있어, 단일 타입 아래에서 다양한 시나리오를 모델링하는 데 강력한 도구가 됩니다.

데이터를 포함하는 열거형 정의하기

각 변형은 자신만의 데이터 구조를 가질 수 있습니다:

enum Message {
    Quit,                          // 데이터 없음
    Move { x: i32, y: i32 },      // 이름이 있는 필드 (구조체 형태)
    Write(String),                 // 단일 값 (튜플 구문)
    ChangeColor(u8, u8, u8),      // 여러 값 (튜플 구문)
}

열거형 인스턴스 생성하기

let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("Hello"));
let m4 = Message::ChangeColor(255, 128, 0);

모든 인스턴스는 서로 다른 데이터를 가지고 있음에도 불구하고 동일한 타입(Message)입니다. 덕분에 컬렉션에 저장하거나, 함수에 전달하거나, 함수에서 일관되게 반환할 수 있습니다.

Debug 트레이트

{:?} 포맷팅을 사용하여 열거형을 출력하려면, Debug 트레이트를 파생(derive)시키세요:

#[derive(Debug)]
enum Message {
    // 변형들...
}

직접 해보기

mod notification;

use notification::Notification;

fn main() {
    // 입력 읽기
    let mut alert_message = String::new();
    std::io::stdin().read_line(&mut alert_message).expect("Failed to read line");
    let alert_message = alert_message.trim().to_string();

    let mut reminder_title = String::new();
    std::io::stdin().read_line(&mut reminder_title).expect("Failed to read line");
    let reminder_title = reminder_title.trim().to_string();

    let mut minutes_input = String::new();
    std::io::stdin().read_line(&mut minutes_input).expect("Failed to read line");
    let reminder_minutes: u32 = minutes_input.trim().parse().expect("Failed to parse minutes");

    // TODO: alert_message를 사용하여 Alert 알림 생성

    // TODO: reminder_title과 reminder_minutes를 사용하여 Reminder 알림 생성

    // TODO: Dismiss 알림 생성

    // TODO: 디버그 포맷 {:?}을 사용하여 각 알림 출력
    // 각 알림은 별도의 줄에 출력되어야 함
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨