유니언 타입

유니언 타입 (Union Type)

여러 타입의 값이 '같은 메모리 공간'을 공유하게 만들고 싶을 때가 있어요. C의 union을 Rust에서 쓰는 방법인데, C와 달리 Rust의 union은 조심스럽게 다뤄야 합니다. 그 이유를 이 문서에서 살펴볼게요.

출처: Rust Reference

유니언 타입(union type) 은 명목적이며 이질적인 C-style union으로, union item의 이름으로 표기됩니다.

union에는 '활성 필드(active field)'라는 개념이 없습니다. 대신 유니언 필드에 접근할 때마다, union 내용물의 일부를 접근하는 필드의 타입으로 transmute(변환)합니다. 같은 메모리를 다른 타입으로 읽어들이는 방식인 거죠.

transmute는 예상치 못한 동작이나 undefined behavior(정의되지 않은 동작)을 일으킬 수 있기 때문에, 유니언 필드를 읽으려면 unsafe가 필요합니다.

유니언 필드의 타입은 또한 drop(해제)이 절대 필요하지 않음을 보장하는 타입의 부분집합으로 제한됩니다. 자세한 내용은 item 문서를 참고하세요.

union의 메모리 레이아웃은 기본적으로 정의되어 있지 않습니다(특히 필드가 반드시 offset 0에 있을 필요는 없어요). 다만 #[repr(...)] 속성으로 레이아웃을 고정할 수 있습니다.

더 알아보기 (Learn more)