열거형 정의하기
구조체가 서로 연관된 필드 및 데이터를 묶는 방법을 제공 했다면 열거형은 어떤 값이 여러개의 간으한 값의 집합 중 하나라는 것을 나타내는 방법을 제공 합니다. 예를들어 Rectangle이 Circle과 Triangle을 포함하는 다양한 모양들의 집합 중 하나라고 표현하고 싶을 수 있습니다.
이때 열거형을 사용하여 나타낼 수 있습니다. 값의 제한과 가독성,안전성을 위해 열거형을 사용합니다.
IP 주소를 열거형으로 나타내면 아래와 같이 나타낼 수 있습니다.
enum IpAddrKind {
V4,
V6,
}
IP 주소라는 것은 IPv4, IPv6 두 종류 입니다. 이 처럼 정해진 값만 사용하도록 값을 제한할 수 있습니다.
열거형의 활용
아래처럼 IpAddrKind의 두 개의 값에 대한 인스턴스를 만들 수 있습니다.
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
열거형을 정의할 때의 식별자로 네임스페이스가 만들어져서 이중콜론(::)으로 접근해야 합니다.
열거형은 함수의 매개변수로도 받을 수 있습니다.
fn route(ip_kind: IpAddrKind) {}
그리고 ipAddrKind의 값 중 하나를 사용해서 함수를 호출 할 수 있습니다
route(IpAddrKind::V4);
route(IpAddrKind::V6);
지금으로써는 IP주소에 대한 타입을 제한 할 수는 있지만 실제 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"),
};
구조체와 열거형을 활용하여 구조체의 kind 필드에 들어갈 수 있는 값을 제한하여 실수를 방지 하고 address 필드를 통해 IP 데이터를 저장합니다.
위 방식은 아래와 같이 축약 할 수도 있습니다. 구조체를 사용하지 않고 열거형만 사용하여 코드량을 줄일 수 있습니다.
enum IpAddr {
V4(String),
V6(String),
}
let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
또한 구조체에서는 V4와 V6가 각각 다른 형태로 데이터를 받지 못합니다. 이때 열거형에서는 인수를 다르게 하여 이 문제를 해결 할 수 있습니다.
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));
사실 IP주소 같은건 흔하기 때문에 직접 타입을 지정해줄 필요는 없습니다. Rust 표준 라이브러리에서 이를 이미 구현해두었기 때문에 아래와 같은 방식으로도 가능합니다.
struct Ipv4Addr {
// --생략--
}
struct Ipv6Addr {
// --생략--
}
enum IpAddr {
V4(Ipv4Addr),
V6(Ipv6Addr),
}
이처럼 열거형에는 어떤 데이터라도 넣을 수 있습니다. Spring Boot를 사용할 때에는 에러 메시지를 열거형으로 미리 정의해두었던 기억이 있습니다. 이렇게 되면 같은 값을 일일히 다시 복붙할 필요도 없어 유용했습니다.
'Rust' 카테고리의 다른 글
Rust 기본개념 - 패턴매칭 match (0) | 2024.12.09 |
---|---|
Rust 기본개념 - 열거형의 활용 (0) | 2024.12.09 |
Rust 기본개념 - 메서드 (0) | 2024.12.07 |
Rust 기본 개념 - 구조체 (2) | 2024.12.07 |
Rust 기본개념 - 슬라이스 (0) | 2024.12.04 |