Rust, 쉽게 하자!

Rust 입문

[Rust] Enum

바로크냥 2022. 10. 5. 23:37

2. Enum

enum은 관계 있는 데이터들을 묶고 이름도 정해주어서 데이터를 좀 더 일관성있고 효율적으로 다룰 수 있게 해줍니다.

enum 이름{
  데이터1,
  데이터2,
  데이터3,
  ...
}

enum은 match와 함께 잘 사용 됩니다. 

다음 예를 통해 알아 보겠습니다. 

 

#[derive(Debug)]        // DAY에 Debug 트레이트 구현
enum DAY {             // DAY enum 선언
    Mon,
    Tue,
    Wen,
    Thu,
    Fri,
    Sat,
    Sun,
}

fn main() {
    let mut day = DAY::Fri;   // DAY 타입 변수 day 생성
    match &day {
        Mon => println!("{:#?}", day),
        Tue => println!("{:#?}", day),
        Wen => println!("{:#?}", day),
        Thu => println!("{:#?}", day),
        Fri => println!("{:#?}", day),
        Sat => println!("{:#?}", day),
        Sun => println!("{:#?}", day),
    }
}

// 출력
Fri

우선 main 함수 바깥의 DAY enum 선언부를 보겠습니다.

요일의 단축명이 나열되어 있는 데이터 묶음이고 이름을 DAY라고 정했습니다.

보통 enum의 이름은 대문자로 정합니다.

enum 선언문 위에 달린  attribute를 보겠습니다.

#[derive(Debug)]

이 코드는, 앞 장에서도 살펴 보았습니다.   enum을 println! 매크로로 출력하기 의한 기능을 첨가하는 용도입니다. 이 코드가 없으면 출력되지 않고 에러가 발생합니다. 

 

다음은 enum DAY 타입의 변수를 만드는 코드입니다.

 let mut day = DAY::Fri;

DAY::Fri 부분을 눈여겨 보십시오.

DAY 타입의 멤버인 Fri라는 뜻입니다.

보통 다른 대부분의 언어에서는 DAY.Fri라고 “.”를 사용하는데 Rust에서는 “::”을 사용합니다.

이렇게 만든 변수 day의 참조인 &day를 match의 변수로 사용했습니다.

 

이 코드를 조금 바꿔서 Rust enum의 독특한 기능에 대해 알아 보겠습니다.

enum의 요소들이 데이터를 가질 수 있습니다.

 

#[derive(Debug)]
enum DAY {
    Mon(String),
    Tue(String),
    Wen(String),
    Thu(String),
    Fri(String),
    Sat(String),
    Sun(String),
}

fn main() {
    let mut day = DAY::Fri(String::from("friday"));
    match &day {
        Mon => println!("{:#?}", day),
        Tue => println!("{:#?}", day),
        Wen => println!("{:#?}", day),
        Thu => println!("{:#?}", day),
        Fri => println!("{:#?}", day),
        Sat => println!("{:#?}", day),
        Sun => println!("{:#?}", day),
    }
}

// 출력
Fri(
    "friday",
)

enum DAY를 선언할 때, 요일명의 모양이 바뀌었습니다.

예를 들어 Mon에서 Mon(String)으로 바뀌었습니다.

이것을 통해서 enum에 포함된 데이터들은 값을 가질 수 있게 됩니다.

이 값들은 String 타입입니다. 

출력 결과도 단순한 Fri가 아닙니다.

Fri는 “friday”를 값으로 가지고 있습니다.

출력값을 깔끔하게 ‘Friday’라고 하기 위해 다음과 같이 코드를 수정합니다.

// 2
#[derive(Debug)]
enum DAY {
    Mon(DayName),
    Tue(DayName),
    Wen(DayName),
    Thu(DayName),
    Fri(DayName),
    Sat(DayName),
    Sun(DayName),
}
// 1
#[derive(Debug)]
enum DayName{
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

fn main() {
    let mut day = DAY::Fri(DayName::Friday);   // 3
    match &day {        // 4
        DAY::Mon(name) => println!("{:#?}", name),
        DAY::Tue(name) => println!("{:#?}", name),
        DAY::Wen(name) => println!("{:#?}", name),
        DAY::Thu(name) => println!("{:#?}", name),
        DAY::Fri(name) => println!("{:#?}", name),
        DAY::Sat(name) => println!("{:#?}", name),
        DAY::Sun(name) => println!("{:#?}", name),
    }
}

// 출력
Friday

// 1: DayName이라는 enum을 하나 더 만들었습니다.

여기에는 요일 이름이 들어 있습니다. 

 

// 2: 이 DayName 타입을 Fri(DayName) 형식으로 DAY 타입 선언 내부에서 바인딩해줍니다.

이제 String이 아니라 DayName타입의 값을 가지게 됩니다. 

 

// 3: Day 변수 선언부에도 이것을 명시합니다.

 let mut day = DAY::Fri(DayName::Friday);

 

// 4: Match 문 내에서 다음과 같은 형식으로 변수를 따로 만들어 바인딩 된 데이터를 불러 올 수 있습니다.

 DAY::Fri(name) => println!("{:#?}", name)

여기에서 name은 DayName 타입의 데이터를 받아 옵니다.

name은 임의로 만든 변수 이름입니다. 다른 이름을 만들어서 사용해도 상관 없습니다.

 

// 출력이 우리가 원하던 형식으로 잘 되었습니다.

 
 
 
 
 
 
반응형

'Rust 입문' 카테고리의 다른 글

[Rust] match 변수 바인딩  (0) 2022.10.07
[Rust] Method  (2) 2022.10.07
[Rust] Struct  (0) 2022.10.05
[Rust] Closure  (0) 2022.10.05
[Rust] 함수  (0) 2022.10.05