학습
Rust 열거형 (Enums)
Rust 열거형 (Enums) — 중급
열거형 (Enums)
1. 도입 (왜 배워야 하는가)
열거형(Enums)은 Rust 프로그래밍에서 매우 중요한 기능입니다. 실무에서 복잡한 데이터 유형을 간결하고 명확하게 다룰 수 있게 해주기 때문에, 특히 다양한 상태나 옵션을 표현할 때 큰 도움이 됩니다. 예를 들어, 쇼핑몰의 주문 상태(주문 대기, 결제 완료, 배송 중 등)를 표현할 때 열거형을 사용하면 코드가 더 가독성이 높아지고 안전하게 됩니다.
만약 열거형을 사용하지 않는다면, 문자열이나 숫자로 상태를 표현해야 할 것이고, 이는 코드의 가독성을 떨어뜨리고 안정성을 해칠 수 있습니다. 잘못된 문자열을 사용하거나, 상태를 놓치는 등의 오류가 발생할 가능성이 커집니다. 따라서 열거형을 이해하고 활용하는 것은 Rust 프로그래머에게 필수적입니다.
2. 핵심 개념 설명
열거형은 관련된 값의 집합을 정의하는데 사용됩니다. 각 값은 고유한 이름을 가지며, 다양한 형태(variant)를 가질 수 있습니다.
비유적으로 설명하자면, 열거형은 '메뉴판'과 같습니다. 메뉴판에는 여러 요리(값)가 나열되어 있으며, 고객은 그 중 하나를 선택할 수 있습니다. 각 요리는 다양한 재료와 조리 방법이 있지만, 고객이 선택할 수 있는 것은 메뉴에 있는 요리뿐입니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| Variant | 열거형의 각 요소를 의미합니다. |
| Enum | 열거형의 전체 구조를 의미합니다. |
| Pattern Matching | 열거형의 값을 처리하는 방법입니다. |
3. 기본 코드 예제
아래는 가장 기본적인 열거형 사용법을 보여주는 코드입니다.
enum OrderStatus {
Pending,
Paid,
Shipped,
}
fn print_order_status(status: OrderStatus) {
match status {
OrderStatus::Pending => println!("주문 대기 중입니다."),
OrderStatus::Paid => println!("결제가 완료되었습니다."),
OrderStatus::Shipped => println!("배송 중입니다."),
}
}
fn main() {
let my_order = OrderStatus::Paid;
print_order_status(my_order);
}
실행 결과
결제가 완료되었습니다.
코드 한 줄씩 동작 설명
enum OrderStatus { ... }:OrderStatus라는 이름의 열거형을 정의합니다. 세 가지 변형(Pending, Paid, Shipped)을 가집니다.fn print_order_status(status: OrderStatus) { ... }:OrderStatus타입을 인자로 받아 상태에 따른 메시지를 출력하는 함수를 정의합니다.match status { ... }:status의 변형에 따라 다른 메시지를 출력하는 패턴 매칭을 수행합니다.let my_order = OrderStatus::Paid;:OrderStatus의 변형 중Paid를 선택하여my_order에 저장합니다.print_order_status(my_order);:my_order의 상태를 출력합니다.- 열거형은 관련된 데이터의 집합을 정의하는 데 매우 유용하다.
- 패턴 매칭을 통해 열거형의 값을 안전하게 처리할 수 있다.
- 실생활에서 다양한 상태나 옵션을 표현할 때 사용된다.
- 구조체(Structs)와 열거형의 결합
- 트레이트(Traits)와 열거형의 상호작용
- Rust의 에러 처리 패턴 (Result와 Option)
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니
쇼핑몰에서 장바구니에 담긴 상품의 상태를 관리할 때 열거형을 사용할 수 있습니다.
enum CartItemStatus {
InStock,
OutOfStock,
PreOrder,
}
fn check_item_status(item: CartItemStatus) {
match item {
CartItemStatus::InStock => println!("상품이 재고 있습니다."),
CartItemStatus::OutOfStock => println!("상품이 품절입니다."),
CartItemStatus::PreOrder => println!("상품이 사전 주문 가능합니다."),
}
}
예제 2: 게임 캐릭터 상태
게임에서 캐릭터의 상태를 표현하기 위해 열거형을 사용할 수 있습니다.
enum CharacterState {
Idle,
Walking,
Running,
Attacking,
}
fn describe_character_state(state: CharacterState) {
match state {
CharacterState::Idle => println!("캐릭터가 대기 중입니다."),
CharacterState::Walking => println!("캐릭터가 걷고 있습니다."),
CharacterState::Running => println!("캐릭터가 달리고 있습니다."),
CharacterState::Attacking => println!("캐릭터가 공격 중입니다."),
}
}
5. 흔한 실수와 주의사항
실수 1: 패턴 매칭을 안 할 경우
fn print_status(status: OrderStatus) {
// match를 하지 않으면 컴파일 오류가 발생합니다.
// println!("{:?}", status);
}
올바른 코드
fn print_status(status: OrderStatus) {
match status {
OrderStatus::Pending => println!("대기 중"),
_ => (),
}
}
실수 2: 열거형의 변형을 잘못 사용
let invalid_order = OrderStatus::Canceled; // Canceled는 정의되지 않음
올바른 코드
enum OrderStatus {
Pending,
Paid,
Shipped,
Canceled, // 추가로 정의
}