[Rust] 열거형(enumeration) Option과 Result
열거형(enumeration) Option과 Result
1. 열거형(enumeration)
열거형(Enumeration 또는 Enum)은 여러 값을 하나의 타입으로 묶어서 표현하는 Rust의 기능 중 하나입니다. 열거형은 다양한 형태의 데이터를 하나의 타입으로 표현할 수 있도록 도와주며, 패턴 매칭이나 다른 커스텀 타입 정의에 사용됩니다.
열거형의 기본 구조
열거형은 enum 키워드를 사용하여 정의됩니다. 가장 간단한 형태의 열거형은 다음과 같습니다:
enum Direction {
North,
East,
South,
West,
}
위의 예제에서 Direction은 North, East, South, West라는 네 개의 변형을 갖는 열거형입니다.
열거형의 값 사용하기
열거형 값은 해당 열거형의 이름과 선택한 변형을 사용하여 생성됩니다.
let my_direction = Direction::East;
열거형에 데이터 저장하기
열거형은 때로는 추가 데이터를 가질 수 있습니다. 이는 열거형의 각 변형에 대한 데이터를 저장하는 것을 의미합니다.
enum Shape {
Circle(f64), // 반지름을 저장하는 Circle 변형
Rectangle(f64, f64), // 가로와 세로를 저장하는 Rectangle 변형
Square(f64), // 한 변의 길이를 저장하는 Square 변형
}
열거형과 패턴 매칭
열거형은 주로 패턴 매칭과 함께 사용됩니다. 패턴 매칭은 열거형의 각 변형에 따라 다른 동작을 수행할 수 있게 해줍니다.
fn print_shape_area(shape: Shape) {
match shape {
Shape::Circle(radius) => {
let area = 3.14 * radius * radius;
println!("원의 면적: {}", area);
}
Shape::Rectangle(width, height) => {
let area = width * height;
println!("사각형의 면적: {}", area);
}
Shape::Square(side_length) => {
let area = side_length * side_length;
println!("정사각형의 면적: {}", area);
}
}
}
이러한 열거형의 사용은 코드를 보다 명확하고 유연하게 만들어주며, 패턴 매칭을 통해 다양한 상황에 대응할 수 있습니다. Rust의 열거형은 다른 언어의 enum과는 달리 각 변형이 다른 형태의 데이터를 가질 수 있어 더욱 강력하게 사용될 수 있습니다.
열거형 중 Option과 Result는 Rust의 표준 라이브러리에서 많이 사용되는 형태라 따로 살펴보겠습니다.
2. Option
Option은 Rust의 표준 라이브러리에서 제공하는 열거형(enumeration) 중 하나로, 값이 존재할 수도 있고, 존재하지 않을 수도 있는 상태를 나타냅니다. 이를 통해 명시적으로 처리되지 않은 null이나 undefined와 같은 상태를 방지하며, 안전성을 높이는 역할을 합니다.
Option은 다음과 같은 두 가지 변형으로 구성되어 있습니다.
- Some(T): 값이 존재하는 경우를 나타냅니다. T는 어떤 타입이든 될 수 있습니다. 예를 들어, Some(42) 는 정수 42가 존재하는 상태를 나타냅니다.
- None: 값이 존재하지 않는 경우를 나타냅니다. 예를 들어, 어떤 계산에서 오류가 발생하거나, 유효한 결과가 없는 경우에 사용됩니다.
Option을 사용하면 명시적으로 처리되지 않은 null을 피하면서, 패턴 매칭이나 unwrap 등을 통해 안전하게 값을 다룰 수 있습니다.
Option의 예제
fn divide(a: f64, b: f64) -> Option<f64> {
if b == 0.0 {
None
} else {
Some(a / b)
}
}
fn main() {
let result = divide(10.0, 2.0);
match result {
Some(value) => println!("나눈 결과: {}", value),
None => println!("0으로 나눌 수 없습니다."),
}
}
이 예제에서 divide 함수는 Option<f64>를 반환하며, main 함수에서는 패턴 매칭을 사용하여 결과를 처리합니다. 이를 통해 오류를 나타내는 Option을 통일된 방식으로 처리할 수 있습니다.
Option은 Some과 None을 통해 명시적으로 값을 다룰 수 있게 해주기 때문에 Rust에서 안전한 프로그래밍을 지원하는 데 큰 역할을 합니다.
3. Result
Result는 Rust에서 오류 처리를 위한 열거형 중 하나입니다. 주로 함수의 반환값으로 사용되며, 함수가 실패하면 에러 정보를 포함하고, 성공하면 결과 값을 포함합니다. 이를 통해 명시적이고 안전한 오류 처리를 할 수 있습니다.
Result는 크게 두 가지 변형으로 이루어져 있습니다.
- Ok(T): 함수가 성공하고 결과 값을 가지고 있는 경우를 나타냅니다. T는 성공한 경우에 반환되는 값의 타입입니다.
- Err(E): 함수가 실패하고 에러 정보를 가지고 있는 경우를 나타냅니다. E는 실패한 경우에 반환되는 에러의 타입입니다.
Result의 예제
fn divide(a: f64, b: f64) -> Result<f64, &'static str> {
if b == 0.0 {
Err("0으로 나눌 수 없습니다.")
} else {
Ok(a / b)
}
}
fn main() {
let result = divide(10.0, 2.0);
match result {
Ok(value) => println!("나눈 결과: {}", value),
Err(err) => println!("에러 발생: {}", err),
}
}
이 예제에서 divide 함수는 Result<f64, &'static str>를 반환하며, main 함수에서는 패턴 매칭을 사용하여 결과를 처리합니다. 성공한 경우에는 Ok를 사용하여 결과 값을, 실패한 경우에는 Err를 사용하여 에러 메시지를 처리합니다.
Result는 예외 처리를 명시적으로 다룰 수 있게 해주어 안전한 코드를 작성하는 데 도움을 줍니다. 특히, 에러가 발생하는 것이 예측 가능하며, 각 에러 상황에 대한 처리가 필요한 경우에 유용하게 활용됩니다.