PhantomData와 제로 사이즈 타입 사용법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Rust 개발자, 중급 이상의 타입 시스템 이해가 필요한 사람
난이도: 중급 (일반적인 Rust 개념 및 제네릭 사용 지식 필요)
핵심 요약
PhantomData
: 타입 간 관계를 컴파일 타임에 강제하는 마커 타입으로, 런타임 비용 없이 타입 안전성 확보- 제로 사이즈 타입 (ZST):
()
또는PhantomData
와 같은 런타임 메모리 크기가 0인 타입으로, 의미적 정보를 추가 가능 - 타입 안전성 강화:
Id
와 같은 구조체에PhantomData
를 활용해Fiction
과NonFiction
과 같은 도메인 간 ID 혼용 방지
섹션별 세부 요약
1. Rust 타입 시스템의 특징
- 컴파일 타임에 불변성과 관계를 명시적으로 인코딩 가능
- 런타임 없이 타입 간 관계를 강제해야 하는 상황에서
PhantomData
활용
2. 제로 사이즈 타입 (ZST)
EmptyStruct
와 같은 타입은 런타임 메모리 크기 0이지만 컴파일 타임에 존재- 예시:
std::mem::size_of::
결과는 0()
3. `PhantomData`의 활용 예시
Id
구조체에PhantomData
를 포함해 도메인별 ID 분리
```rust
struct Id
value: u64,
_marker: PhantomData
}
```
Fiction
과NonFiction
마커 타입으로 ID 혼용 방지
4. `PhantomData`와 라이프타임
PhantomData<&'a ()>
를 통해 라이프타임을 컴파일 타임에 명시
```rust
struct Borrowed<'a> {
_marker: PhantomData<&'a ()>,
}
```
5. 주의사항 및 실수 예방
PhantomData
를 무분별하게 사용하면 의미적 오류 발생 가능- 타입 마커 누락 시 컴파일러 최적화로 의도치 않은 동작 발생
결론
PhantomData
는 타입 관계를 강제하고 런타임 비용 없이 타입 안전성을 확보하는 데 필수적Id
와 같은 구조체에서 도메인별 ID 분리에 적합PhantomData
사용 시 타입/라이프타임과 실제 코드 의미가 일치하는지 철저히 검증해야 함