동적 크기 타입
동적 크기 타입 (Dynamically Sized Types)
대부분의 타입은 컴파일 타임에 크기가 정해져 있어요. 그런데 어떤 타입은 실행 시점에만 크기를 알 수 있어요. 이번 장에서는 그런 타입이 무엇인지, 그리고 어디에 쓸 수 있는지 알아볼게요.
출처: Rust Reference
본문
대부분의 타입은 컴파일 타임에 알 수 있는 고정된 크기를 가지고 있고 Sized trait을 구현해요. 크기가 실행 시점에만 알려지는 타입을 동적 크기 타입(DST, dynamically sized type)이라고 부르고, 비공식적으로는 unsized 타입이라고도 해요. 슬라이스(slice), trait 객체(trait object), str이 DST의 대표적인 예시예요.
이런 타입은 특정 경우에만 사용할 수 있어요:
- 슬라이스 포인터는 요소의 개수를 저장하고,
str포인터는 바이트 단위의 길이를 저장해요. - trait 객체 포인터는 vtable에 대한 포인터를 저장해요.
- unsized 꼬리를 가진 구조체나 튜플 포인터는 그 꼬리에 대한 포인터와 같은 메타데이터를 저장해요.
- DST는 특별한
?Sized바운드를 가진 제네릭 타입 매개변수에 타입 인자로 제공될 수 있어요. 또한 대응하는 연관 타입 선언에?Sized바운드가 있을 때 연관 타입 정의로도 쓸 수 있어요. 기본적으로 모든 타입 매개변수와 연관 타입에는Sized바운드가 있는데,?Sized로 완화하지 않으면 그대로예요. - DST에 대해 trait을 구현할 수 있어요. 제네릭 타입 매개변수와 달리 trait 정의에서는
Self: ?Sized가 기본값이에요. - 구조체는 마지막 필드로 DST를 가질 수 있고, 그러면 그 구조체 자신이 DST가 돼요.
참고: 변수, 함수 매개변수, const 항목, static 항목은 반드시
Sized여야 해요.
unsized 꼬리 (Unsized tail)
타입의 unsized 꼬리는, 그 타입에 대한 포인터의 메타데이터가 설명하는 동적 크기의 구성 요소예요. 슬라이스([T])와 str은 각각 자신이 unsized 꼬리이고 길이(length)로 설명돼요. trait 객체(dyn Trait)도 자신이 unsized 꼬리이고 vtable 포인터로 설명돼요. 구조체나 튜플이 unsized 마지막 필드를 가질 때는 그 필드의 unsized 꼬리가 타입의 unsized 꼬리가 돼요. 크기가 고정된(sized) 타입은 unsized 꼬리가 없어요.
더 알아보기 (Learn more)
- 슬라이스 타입
[T]의 구체적 문법과 사용은 Slice types 챕터를 참고해요. ?Sized바운드가 제네릭에서 실제로 쓰이는 예는 표준 라이브러리의Box<T>같은 스마트 포인터를 살펴보면 좋아요.