열거형 타입

열거형 타입 (Enumerated Type)

여러 값 중 하나를 골라 담되, 각 값이 서로 다른 형태를 가질 수 있는 타입이 필요할 때가 있어요. Rust의 열거형(enum)이 정확히 그 역할을 맡습니다. 서로 다른 타입을 한데 묶은 '분리 합집합(disjoint union)'이라 부르는데요, 이 문서에서 그 구조를 정리해 볼게요.

출처: Rust Reference

열거형 타입(enumerated type) 은 명목적(nominal)이며 이질적인 분리 합집합 타입으로, enum item의 이름으로 표기됩니다. 다시 말해 타입이 구조가 아니라 '정의된 이름'으로 식별되는 타입이라는 뜻이에요.

enum item은 타입과 그 안의 variant(배리언트)들을 함께 선언합니다. 각 variant는 독립적으로 이름을 가지며, struct·튜플 struct·유닛 struct 중 하나의 문법을 따릅니다. 그래서 배리언트마다 담는 데이터의 모양이 서로 달라질 수 있어요.

enum 인스턴스는 struct 표현식으로 만들 수 있습니다.

enum 값이 차지하는 메모리는 자기 해당 enum 타입에서 가장 큰 배리언트의 크기와, discriminant(판별값)을 저장하는 크기를 더한 값입니다. 열거형이 '가장 큰 배리언트에 맞춰' 메모리를 잡는 이유가 여기에 있어요.

열거형 타입은 타입으로서 구조적으로 표기될 수 없고, 반드시 enum item을 이름으로 참조해 표기해야 합니다. 정의 없이 그때그때 모양만으로 열거형 타입을 적는 일은 불가능한 셈이죠.


  1. enum 타입은 Haskell의 data 생성자 선언이나 Limbo의 pick ADT와 유사합니다.

더 알아보기 (Learn more)