열거형(Enum)으로 가능한 값 정리하기
열거형(Enum)으로 가능한 값 정리하기
값이 "여러 가지 경우 중 하나"라면 어떻게 표현할까요? struct는 필드를 묶어 주는 도구라면, enum은 값이 될 수 있는 경우의 수를 열거해서 하나로 묶어 주는 도구예요. 예를 들어 IP 주소가 IPv4인지 IPv6인지를 나타낼 때처럼, 정해진 몇 가지 중에서 골라야 하는 상황에서 아주 잘 어울려요.
enum 키워드 뒤에 이름을 쓰고, 중괄호 안에 각 경우(variant)를 나열하면 돼요. IP 주소의 종류를 나타내는 enum을 만들어 볼게요.
enum IpAddrKind {
V4,
V6,
}
이렇게 정의하면 IpAddrKind::V4처럼 경로 문법으로 특정 variant를 가리킬 수 있어요. 그런데 IP 주소는 종류만 중요한 게 아니라 실제 주소 값도 필요하죠. Rust의 enum은 각 variant에 데이터를 직접 담을 수 있어서, 종류와 값을 한곳에 묶어 표현할 수 있어요.
enum IpAddr {
V4(String),
V6(String),
}
let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
variant에는 문자열뿐 아니라 숫자, struct, 심지어 다른 enum까지 어떤 타입이든 담을 수 있어요. 표준 라이브러리의 IpAddr도 이와 비슷하게 설계되어 있어요.
Option으로 "값이 없음"을 표현하기
Rust에는 null이 없는 대신, 값이 있을 수도 없을 수도 있는 상황을 Option enum으로 표현해요. Option은 제네릭 타입 매개변수 <T>를 쓰는데, 여기서는 Some variant가 어떤 타입의 데이터든 한 조각 담을 수 있다는 뜻 정도로 이해하면 돼요.
enum Option<T> {
None,
Some(T),
}
Some은 값이 있다는 뜻이고, None은 값이 없다는 뜻이에요. null 대신 Option을 쓰면 컴파일러가 "이 값은 없을 수 있다"는 사실을 항상 체크하게 해줘서, null 참조로 인한 런타임 오류를 미리 예방할 수 있어요.