시뻘건 개발 도전기

러스트 15 - 열거형 #1 본문

프로그래밍/RUST

러스트 15 - 열거형 #1

시뻘건볼때기 2019. 3. 24. 01:21
반응형

enum(Enumeration)은 예전에 java를 공부할 때 처음 알게되었고 직접 개발할 때 사용해본 경험은 없다. 그 enumrust에도 있다는 것.

"열거형"이라고 부르는 enum은 말 그대로 "값을 열거해서 유형을 define한 것"이다.


다음 코드를 보자.

fn main() {

    // Family enum 정의

    enum Family {

        // variants #1

        Mother,

        Father,

        Brother,

        Sister,

        // variants #2

        Mother(String),

        Father(String),

        Brother(String),

        Sister(String),

    }


    // 접근 #1

    let mother = Family::Mother;

    let father = Family::Father;

    // 접근 #2

    let mother = Family::Mother(String::from("Ray"));

    let father = Family::Father(String::from("Marco"));

    // 접근 #3

    // let mother = Family::Mother(String::from("Ketty"), String::from("Maeng"));

}


열거되는 녀석들을 "variant"라고 부른다. 


구조체와 비교를 해보자.

1. 내가 알고 있는 enum의 모습은 #1의 모습이다. 하지만 #2처럼 rust에서는 데이터를 정해줄 수 있다. 물론 #3처럼 두 가지 이상 까지도 가능하다.

2. 메소드 정의 및 사용이 가능하다.

fn main() {

    enum Today {

        Sleep, // 유닛 variant

        Go_to { x: i32, y: i32 },

        Eat(String),          // String value를 갖는 variant

        Speak(i32, i32, i32), // i32 value 3개를 닺는 variant

    }


    impl Today {

        fn print_(&self) {

            println!("Good LUCK!!!");

        }

    }


    let today = Today::Eat(String::from("Pasta"));

    today.print_();

}




열겨형에는 타입이 또 있다.... (읭? 타입이 두개라고....? 맘에 안드는데....ㅠㅠ)

"Option"이라는 타입의 열거형인데. 상당히 많이 사용되고 있는 녀석인 것 같다.


지금까지 공부하면서 가장 흔하디 흔한 null 혹은 undefined 녀석이 보이질 않는다..이미 등장 하기엔 너무나도 늦었다.

그렇다. 러스트는 없다. 좋은 점도 있지만 좋지 않은 점도 분명히 있을 것 같다...

그러나 이제 곧 공부할 Option이라는 타입의 enum값이 있을 수 있고 없을 수 있다.

분명 러스트에는 null값이 없다고......(짜증)


코드를 통해 알아보자..

fn main() {

    // 표준 라이브러리

    enum Option<T> {

        Some(T),

        None,

    }


    let not_null = Some("이 것은 값이 있습니다.");

    let null : Option<String> = None;    // error

}


자세히 알아보니 Option은 우리가 만들어서 사용하지 않는다.(표준 라이브러리에 포함됨)

완벽히 이해 하려면 시간이 걸릴 듯 싶다... 이게 왜 필요한지, 왜 많이 사용 되는지... null이 없는데 값이 있는지 없는지 체크를 왜하지...?

무튼... Option라이브러리 Docs에 나와 있으니 참고 하면 될 것 같다.


Option variants에 접근 하는 방법이 다르고 <T>라고 하는 새로운 녀석이 보인다. (Generic Type 파라미터다.)


(우리가 변수를 선언할 때 보통 초기화(사람마다 다르고 때에 따라 다르지만, String일 경우 "" 혹은 null, int일 경우 0 등)를 하게 되는데 이 때 사용하는 녀석인가...??? 긁적긁적)

OptionNonenull을 의미 하는 것 같은데...


Rust Document에 의하면 다음과 같은 이유가 있다.

"Option<T>" and "T" (where "T" can be any type) are different types, the compiler won’t let us use an "Option<T>" value as if it were definitely a valid value. For example, this code won’t compile because it’s trying to add an i8 to an "Option<i8>":


// 직역

"Option<T>" 와 "T" ("T"는 모든 타입이 될 수 있음)는 다른 타입이고, 컴파일러는 "Option<T>"값을 명확하게 유효한 값처럼 사용하지 못하도록 합니다. 예를 들면, 아래 코드는 "Option<i8>" 에 "i8" 을 더하려고 하기 때문에 컴파일되지 않을 것입니다.


"Option<T>와 <T>는 다르기 때문에 error다." 라는 이야기 인 것 같다.

전에 언급하였듯이, 컴파일러는 우리가 항상 유효한 값을 가지도록 보장해준다. 그 말은 즉슨 값을 사용하기 전에 "값이 있는지 없는지 확인할 필요가 없다." 라는 것. 다만... Option<T>이 사용되고 있을 경우에만 확인이 되어야 한다. 따라서, 컴파일러는 값을 사용하기 전에 이러한 케이스를 처리해 줄 것이다.

값이 없을 수도 있는 변수가 있다면 반드시 명시적으로 Option<T>로 만들어 주자.


이 것은 null을 너무 많이 사용하는 문제를 제한하고, 러스트 코드의 안정성을 높여준다.



러스트에서의 enum은 구조체와 상당히 비교되는 건 사실이다. 어떤게 좋고 나쁘고를 따지지 않고 상황에 맞게 더 좋은 성능을 낼 수 있도록 사용하면 될 것 같다.

당연히 매 순간 null값 주의하자...

반응형

'프로그래밍 > RUST' 카테고리의 다른 글

러스트 17 - if let  (0) 2019.03.30
러스트 16 - 열거형 #2  (0) 2019.03.24
러스트 14 - 구조체 #2 : 메소드  (0) 2019.03.10
러스트 13 - 구조체 #1  (0) 2019.03.10
러스트 12 - 슬라이스 타입  (0) 2019.03.03
Comments