Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

열거형

enum 키워드는 몇 가지 다른 변체 중 하나일 수 있는 타입을 생성할 수 있게 합니다. struct로 유효한 모든 변체는 enum에서도 유효합니다.

// 웹 이벤트를 분류하기 위한 `enum`을 생성합니다. 이름과 타입 정보가
// 함께 변체를 지정하는 방식에 주목하세요:
// `PageLoad != PageUnload` 이고 `KeyPress(char) != Paste(String)` 입니다.
// 각각은 서로 다르고 독립적입니다.
enum WebEvent {
    // `enum` 변체는 유닛 형태(unit-like)일 수도 있고,
    PageLoad,
    PageUnload,
    // 튜플 구조체 형태일 수도 있으며,
    KeyPress(char),
    Paste(String),
    // 또는 C 구조체 형태일 수도 있습니다.
    Click { x: i64, y: i64 },
}

// `WebEvent` 열거형을 인자로 받고 아무것도 반환하지 않는 함수입니다.
fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad => println!("페이지 로드됨"),
        WebEvent::PageUnload => println!("페이지 언로드됨"),
        // `enum` 변체 내부에서 `c`를 구조 분해합니다.
        WebEvent::KeyPress(c) => println!("'{}' 키가 눌렸습니다.", c),
        WebEvent::Paste(s) => println!("\"{}\"가 붙여넣기 되었습니다.", s),
        // `Click`을 `x`와 `y`로 구조 분해합니다.
        WebEvent::Click { x, y } => {
            println!("x={}, y={} 지점이 클릭되었습니다.", x, y);
        },
    }
}

fn main() {
    let pressed = WebEvent::KeyPress('x');
    // `to_owned()`는 문자열 슬라이스로부터 소유권이 있는 `String`을 생성합니다.
    let pasted  = WebEvent::Paste("나의 텍스트".to_owned());
    let click   = WebEvent::Click { x: 20, y: 80 };
    let load    = WebEvent::PageLoad;
    let unload  = WebEvent::PageUnload;

    inspect(pressed);
    inspect(pasted);
    inspect(click);
    inspect(load);
    inspect(unload);
}

타입 별칭

타입 별칭을 사용하면, 별칭을 통해 각 열거형 변체를 참조할 수 있습니다. 이는 열거형의 이름이 너무 길거나 너무 일반적이어서 이름을 바꾸고 싶을 때 유용할 수 있습니다.

enum VeryVerboseEnumOfThingsToDoWithNumbers {
    Add,
    Subtract,
}

// 타입 별칭을 생성합니다
type Operations = VeryVerboseEnumOfThingsToDoWithNumbers;

fn main() {
    // 길고 불편한 이름 대신 별칭을 통해 각 변체를 참조할 수 있습니다.
    let x = Operations::Add;
}

이를 가장 흔히 볼 수 있는 곳은 Self 별칭을 사용하는 impl 블록 내부입니다.

enum VeryVerboseEnumOfThingsToDoWithNumbers {
    Add,
    Subtract,
}

impl VeryVerboseEnumOfThingsToDoWithNumbers {
    fn run(&self, x: i32, y: i32) -> i32 {
        match self {
            Self::Add => x + y,
            Self::Subtract => x - y,
        }
    }
}

열거형과 타입 별칭에 대해 더 자세히 알아보려면, 이 기능이 Rust에서 안정화되었을 때의 안정화 보고서를 읽어보세요.

참고:

match, fn, 그리고 String, “타입 별칭 열거형 변체” RFC