반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • bean Validation
  • 슬로우 쿼리
  • 토비의 스프링
  • 메이븐 페이즈
  • 외래키 제약조건
  • 자바
  • Next.js
  • 디자인패턴
  • MSSQL
  • 자료구조
  • 자바스크립트
  • 알고리즘
  • item8
  • 빈 검증
  • try-with-resources
  • 작업기억공간
  • 서버리스 컴퓨팅
  • 도커공식문서
  • 자바스크립트 인터뷰
  • 자바스크립트 면접
  • 참조 해제
  • 이펙티브 자바 item9
  • 자바 검증
  • 싱글톤
  • NEXT JS
  • 스프링 검증
  • 이펙티브 자바
  • next js app
  • 이펙티브자바
  • 자바 디자인패턴
  • 느린 쿼리
  • Java
  • 팩터리 메서드 패턴
  • 객체복사
  • 러스트
  • rust
  • 메이븐 골
  • Javadoc 자바독 자바주석 주석 Comment
  • pnpm
  • item9
  • 추상 팩터리 패턴
  • 플라이웨이트패턴
  • Pre-rendering
  • 프로그래머의 뇌
  • serverless computing
  • 메이븐 라이프사이클
  • 싱글톤 패턴
  • prerendering
  • item7
  • 싱글턴

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

러스트 (Rust)

러스트 (Rust) 열거형 1 - 기본 문법

2022. 12. 3. 03:30

열거형 (enumerations, enums) 이란?

하나의 타입이 가질 수 있는 값의 경우의 수가 제한적일 때 사용할 수 있다.

ex) 손가락이라는 타입은 일반적으로 '엄지', '검지', '중지', '약지', '새끼' 중에 하나이다.

러스트에는 Option, match, if let 과 같은 키워드를 통해 열거형을 효과적으로 표현할 수 있다.

열거형은 많은 언어에 존재하지만, 각 언어마다 열거형으로 할 수 있는 것들이 다르다.
러스트의 열거형은 F#, OCaml, Haskell 과 같은 함수형 언어의 대수 데이터 타입과 비슷하다.

열거형이 적절한 경우

  • variants 라 불리는 한정적 경우의 수 중 하나만 될 수 있을 때 적절하다.
  • IP 주소는 v4 혹은 v6 라는 두가지 선택지만 존재한다.
    • 이 둘 중 하나여야 하며, 다른 경우는 없다.

열거형 코드로 정의하기

enum IpAddrKind {
    V4,
    V6,
}
  • enum 키워드를 사용하여 열거형을 정의할 수 있다.
  • enum 이름 { } 형태에서 대괄호 내에 열거형 variants 를 정의할 수 있다.

열거형을 이용한 변수 정의

let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

열거형의 요소를 변수에 할당하려면 열거형::variant 형태로 작성하면 된다.

구조체와의 비교, 어떤 때 열거형이 더 적합한가?

IP 주소를 체계적으로 저장하고 싶다고 가정하자.

구조체를 이용했을 때

enum IpAddrKind {
    V4,
    V6,
}

struct IpAddr {
    kind: IpAddrKind,
    address: String,
}

let home = IpAddr {
    kind: IpAddrKind::V4,
    address: String::from("127.0.0.1"),
};

let loopback = IpAddr {
    kind: IpAddrKind::V6,
    address: String::from("::1"),
};
  • IpAddrKind 로 열거형 타입을 만든 뒤 IpAddr 구조체의 프로퍼티 타입으로 사용하여 IP 주소에 대한 정보를 저장했다.
  • 약간 장황하긴 해도, 데이터를 저장하는데 무리는 없다.

열거형을 이용했을 때

enum IpAddr {
    V4(String),
    V6(String),
}

let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
  • 간결하면서도 코드를 읽는 입장에서 동일한 의미로 해석될 수 있는 코드를 작성할 수 있다.

열거형의 장점: 종류별로 다른 타입의 값을 가질 때

enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}
  • 구조체로 구성했으면 복잡했을 수도 있는 부분이지만, 열거형으로 표현하면 간단하다.

표준 라이브러리의 용례

struct Ipv4Addr {
    // details elided
}

struct Ipv6Addr {
    // details elided
}

enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}
  • 각각 다른 타입에 의해 초기화될 수 있도록 지정했다.
  • 러스트의 열거형은 다른 열거형마저 포함할 수 있다.

열거형의 좋은 사용 예시

enum Message {
    Quit,
    Move {x: i32, y: i32},
    Write(String),
    ChangeColor(i32, i32, i32),
}
  • 열거형 Message 는 Message 가 가질 수 있는 variants 들을 훌륭하게 표현하고 있다.

열거형을 다시 구조체로 나타내보기

struct QuitMessage; // 유닛 구조체
struct MoveMessage {
    x: i32,
    y: i32,
}
struct WriteMessage(String); // 튜플 구조체
struct ChangeColorMessage(i32, i32, i32); // 튜플 구조체
  • Message 열거형은 사실 여러개의 구조체가 뭉쳐있는 것과 동일한 형태였다.

열거형에 메서드 구현하기

impl Message {
    fn call(&self) {
        // 메소드 내용은 여기 정의할 수 있습니다.
    }
}

let m = Message::Write(String::from("hello"));
m.call();

Option 열거형

Null 특성 에 대하여

  • 값이 있을수도 없을수도 있는 상황을 나타낸다.
  • Rust 에는 Null 특성이 존재하지 않는다.
    • 타 언어에 있는 Null 특성은 Null 인 값을 Null 이 아닌 것처럼 사용했을 때 오류를 만들어내며, 종종 추적하기 어려운 오류가 만들어지기도 한다.

Rust 의 Option

enum Option<T> {
    Some(T),
    None,
}
  • 이 타입과 if-let 혹은 match 와 같은 예약어를 이용해 컴파일러가 모든 경우를 처리했는지 검증할 수 있게 된다.
    • 버그를 방지할 수 있다.
    • 다른 언어에서도 흔하게 보이는 패턴이다.
  • 기본적으로 언어에 포함되기 때문에 명시적으로 가져오지 않아도 사용이 가능하다.
  • Option 의 열거형인 Some 과 None 은 앞에 Option:: 을 붙이지 않아도 바로 사용 가능하다.
  • <T> 는 제너릭 파라미터이다.

Option 열거형 초기화하기

let some_number = Some(5);
let some_string = Some("a string");
let absent_number: Option<i32> = None;

Option<T> 는 T 와 같은 타입이 아니다.

let x: i8 = 5;
let y: Option<i8> = Some(5);

let sum = x + y;
  • 위 코드는 당연히 에러가 나게 된다.
error[E0277]: the trait bound `i8: std::ops::Add<std::option::Option<i8>>` is
not satisfied
 -->
  |
7 | let sum = x + y;
  |           ^^^^^
  |
  • 사용을 위해 Option<T> 를 T 로 변환시키는 작업이 필요하다.

러스트가 Option 을 통해 의도한 것

  • Option<T> 타입이 아닌 모든 타입은 null 이 아님을 안전하게 가정할 수 있다.
  • 타 언어에서처럼 null 의 남용을 막는다.
  • 어떤 값이 Option<T> 라면 Option<T> 의 각 variants 경우의 수에 따른 처리를 모두 구현해야 한다.
    • 이 때 if-let 혹은 match 가 매우 유용하다.
반응형
저작자표시 비영리

'러스트 (Rust)' 카테고리의 다른 글

러스트 (Rust) 열거형 3 - if-let 키워드  (0) 2022.12.03
러스트 (Rust) 열거형 2 - match 키워드  (0) 2022.12.03
러스트 (Rust) 메서드 (Method) 문법  (0) 2022.11.03
러스트 (Rust) 구조체를 이용한 리팩토링 연습  (0) 2022.11.03
러스트 (Rust) 구조체 정의하고 생성하는 방법  (0) 2022.11.03
    '러스트 (Rust)' 카테고리의 다른 글
    • 러스트 (Rust) 열거형 3 - if-let 키워드
    • 러스트 (Rust) 열거형 2 - match 키워드
    • 러스트 (Rust) 메서드 (Method) 문법
    • 러스트 (Rust) 구조체를 이용한 리팩토링 연습
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바