Rust - 열거형(enum)[Option, Result]

Kurt·2023년 9월 14일
0

[Rust Language]

목록 보기
9/24

개요

Rust에서 사용되는 열거형에 대해서 자세하게 공부


조사

  1. 열거형은 일반적으로 상태를 정의하기 위한 타입
  2. 하나의 타입에 여러 선택 가능한 값을 정의하고 선택하게끔 하는 특수한 타입
  3. 열거형에는 어떤 종류의 데이터라도 넣을 수 있다(문자열, 숫자, 구조체, 다른 열거형 등등)

간단한 사용 방법

Rust에서 열거형은 다음과 같이 사용한다.

enum IpAddr {
    V4,
    V6,
}

위 코드에서는 V4, V6 두 가지 값 중 하나를 가질 수 있는 IpAddr 이라는 타입을 정의한다.

응용

match를 사용하여 다음과 같이 응용할 수 있다.

enum IpAddr {
    V4,
    V6,
}

fn main() {

    let v4_type = IpAddr::V4;

    match v4_type {
        IpAddr::V4 => println!("IP v4"),
        IpAddr::V6 => println!("IP v6"),
        _ => println!("What is this Type..?"),
    }
}

결과: IP v4


Option 열거형 타입

Rust 표준 라이브러리에는 Option 열거형 타입이 정의되어 있다.

왜 사용하는가

Rust는 다른 프로그래밍 언어와 달리 Null 타입을 지원하지 않고 있는데, 대신에 Option 타입을 활용하여 값(value)이 있는지 없는지를 컴파일 타임에 체크할 수 있다고 한다!

  1. Rust에서 어떤 변수가 Option 타입이 아니라면 그 변수는 항상 값을 갖는다고 볼 수 있다
  2. Rust에서 어떤 변수가 Null과 같이 값을 갖지 않고 있다면 Option을 사용하여 이를 핸들링할 수 있다.

아래 예시를 보자

enum Option<T> {
	None,
    Some(T),
}

Option 열거형에서 아래 2가지를 핵심 무기로 사용한다.
1. None: 데이터가 없다는 것을 의미한다
2. Some: 데이터가 있다는 것을 의미하는데, Some에 들어갈 데이터 타입을 제네릭 타입 T로 지정한다.


여기서 제네릭 타입이란 임의의 데이터 타입을 받아들일 수 있게 만든 것을 뜻한다.
예를 들면 T에는 i32, f64, string등이 들어갈 수 있다.


option 열거형을 사용하기 위해서는 다른 열거형과 마찬가지로 Option::None 혹은 Option::Some(값)을 사용한다.

예시

fn main() {
    // Option::None 지정
    let no_index: Option<i32> = Option::None;
    // Option::Some 지정 
    let index: Option<i32> = Option::Some(1);
     
    // Option:: 생략 표현
    let no_index: Option<i32> = None;
    let index = Some(1);
 
    println!("{:?}, {:?}", no_index, index);
}

결과: None, Some(1)


Result 열거형 타입

Result는 함수의 반환 값으로 사용되며, 함수가 성공적으로 실행되었는지 또는 오류가 발생하였는지를 나타낸다.

두가지 값

Pption 열거형은 None, Some을 갖지만 Result 열거형은 Ok, Err을 가지고 있다.

  1. Ok:성공 값을 나타냄
  2. Err: 오류 값을 나타냄

Option 열거자가 값이 있다 없다와 관계 있었다면 Result는 제대로 실행 되었나 아니면 에러가 발생 되었나 하는 문제를 다룬다!

예시 코드는 다음과 같다.

fn divide(x: f64, y: f64) -> Result<f64, String> {
    if y == 0.0 {
        Err("Error 0.0".to_string())
    } else {
        Ok(x / y)
    }
}

fn main() {
    match divide(10.0, 2.0) {
        Ok(result) => println!("결과 {}", result),
        Err(error) => println!("오류 {}", error),
    }
}

라인별로 설명하자면

fn diveide(x: f64, y: f64) -> Result<f64, String> {

divide 함수를 생성하고 f64 타입으로 x와 y의 값을 받는다.
성공 시 f64 타입으로 출력하고 실패 시 String 형식으로 출력하게 된다.

    if y == 0.0 {
        Err("Error 0.0".to_string())
    } else {
        Ok(x / y)
    }

y의 값이 0인 경우 나눗셈이 되지 않기 때문에 y의 값이 0인 경우 Err 출력

fn main() {
    match divide(10.0, 2.0) {
        Ok(result) => println!("결과 {}", result),
        Err(error) => println!("오류 {}", error),
    }
}

Result의 값이 Ok인 경우 result에 Ok의 내부 값을 바인딩하고 결과에 대해서 출력한다.
Result의 값이 Err인 경우 error에 error 값을 출력한다.


출처:
> SEORENN COMPLEX LOGS - 러스트의 열거형(Enums) 살펴보기
> 예제로 배우는 Rust 프로그래밍 - 열거형-enum


profile
내 인생이라는 프로젝트의 최고 버전을 만들기 위해

0개의 댓글