일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Java
- JPA
- framework
- 알고리즘
- 코드
- 코딩
- 자바
- 그리디
- 프레임워크
- 엘라스틱서치
- cleancode
- 스프링
- 애자일기법
- 개발자
- Baekjoon
- 그리디알고리즘
- 애자일프로그래밍
- 코딩테스트
- ES
- Spring
- 클린코드
- 개발
- 백준
- API
- 애자일
- spring boot
- 읽기쉬운코드
- Elasticsearch
- database
- 데이터베이스
- Today
- Total
튼튼발자 개발 성장기🏋️
러스트 15 - 열거형 #1 본문
enum(Enumeration)은 예전에 java를 공부할 때 처음 알게되었고 직접 개발할 때 사용해본 경험은 없다. 그 enum이 rust에도 있다는 것.
"열거형"이라고 부르는 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 등)를 하게 되는데 이 때 사용하는 녀석인가...??? 긁적긁적)
Option의 None이 null을 의미 하는 것 같은데...
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 |