comnic's Dev&Life

[Rust] 열거형(enumeration) Option과 Result 본문

Rust

[Rust] 열거형(enumeration) Option과 Result

comnic 2023. 12. 3. 07:45
반응형

열거형(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은 다음과 같은 두 가지 변형으로 구성되어 있습니다.

  1. Some(T): 값이 존재하는 경우를 나타냅니다. T는 어떤 타입이든 될 수 있습니다. 예를 들어, Some(42) 는 정수 42가 존재하는 상태를 나타냅니다.
  2. 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는 크게 두 가지 변형으로 이루어져 있습니다.

  1. Ok(T): 함수가 성공하고 결과 값을 가지고 있는 경우를 나타냅니다. T는 성공한 경우에 반환되는 값의 타입입니다.
  2. 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는 예외 처리를 명시적으로 다룰 수 있게 해주어 안전한 코드를 작성하는 데 도움을 줍니다. 특히, 에러가 발생하는 것이 예측 가능하며, 각 에러 상황에 대한 처리가 필요한 경우에 유용하게 활용됩니다.

반응형
Comments