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 |