C.W.K.
Stream
Lesson 01 of 06 · published

Enum — 여럿 중 하나

~11 min · enums, sum-type, variants

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

struct 는 '이것들 한꺼번에 다' 라고 말해. enum 은 '이것들 중 정확히 하나' 라고 말해. 그 뒤집기 — AND 에서 OR 로 — 가 관용적 Rust 의 핵심인 데이터 모델링 방식을 열어.

데이터 있거나 없는 variant

enum 은 이름 붙은 variant 들을 나열해. enum 값은 한 번에 한 variant 야. Rust enum 을 강력하게 만드는 비결: 각 variant 가 자기 모양의 자기 데이터를 실을 수 있어. 한 variant 는 비고, 다른 건 튜플을 들고, 또 다른 건 struct 같은 필드 묶음을 들고 — 다 한 타입 아래.

왜 sum type 이라 부르냐

struct 는 'product type' 이야 — 가능한 값 집합이 필드들 가능성의 곱이거든. enum 은 'sum type' 이야 — 가능한 값이 variant 들의 합. 학술적인 게 아니야: 진짜로 여럿-중-하나인 값을 모델링하는 도구야, Quit 이거나, 좌표 든 Move 거나, 문자열 든 Text 인 메시지처럼.

enum 은 illegal state 를 표현 불가능하게 만들어. 값이 진짜 세 상태 중 하나만 될 수 있으면, variant 셋짜리 enum 은 네 번째 유효하지 않은 상태를 말 그대로 만들 수 없게 해. 타입 시스템이 이미 금지한 경우를 위한 방어 검사를 그만 쓰게 돼.

enum 도 메서드를 가져

struct 처럼 enum 도 메서드 있는 impl 블록을 가질 수 있어. enum 메서드는 보통 variant 마다 다른 걸 하려고 match self 로 시작해 — 바로 다음 레슨들이 향하는 곳이야.

Code

enum 하나, 다르게 생긴 variant 넷·rust
enum Message {
    Quit,                        // 데이터 없음
    Move { x: i32, y: i32 },     // struct 같은 필드
    Write(String),               // 값 하나
    ChangeColor(i32, i32, i32),  // 값들의 튜플
}

impl Message {
    fn describe(&self) -> &str {
        match self {
            Message::Quit => "quit",
            Message::Move { .. } => "move",
            Message::Write(_) => "write",
            Message::ChangeColor(..) => "color",
        }
    }
}

fn main() {
    let m = Message::Write(String::from("hi"));
    println!("{}", m.describe());
}

External links

Exercise

신호등을 variant 셋짜리 enum 으로 모델링해. 데이터를 싣는 variant 를 더해 — 예를 들면 RGB 색용 Custom(u8, u8, u8). 각 신호가 몇 초 지속되는지 반환하는 메서드를 써. 여기서 왜 enum 이 boolean 세 개보다 나은 모델이야?
Hint
boolean 셋은 불가능한 상태를 인코딩할 수 있어 (빨강 AND 초록 동시). enum 은 신호를 한 번에 정확히 한 색으로 만들어 — 불법 조합은 못 지어져.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.