좋은 질문입니다!
필드가 없는 구조체는 Rust에서 다음과 같은 용도로 자주 사용됩니다:
struct MyMarker;
MyMarker처럼 괄호 없이 사용 가능| 용도 | 설명 |
|---|---|
| 마커 타입(Marker type) | 타입 수준에서 의미를 구분하기 위한 빈 구조체 예: PhantomData<T>와 함께 사용 |
| 제네릭 구분용 태그 | 제네릭에서 특정 동작을 분기할 때 |
| 상태 머신 구현 | 상태별로 구조체를 정의하고 필드 없이 구분 |
| 트레이트 구현용 태그 | 특정 타입에 대해 트레이트를 구현하고, 타입 인자로만 활용 |
| 제로 코스트 타입 | 필드가 없기 때문에 메모리 차지도 안 함 (크기 = 0) |
struct Admin;
struct Guest;
trait Permission {
fn can_delete(&self) -> bool;
}
impl Permission for Admin {
fn can_delete(&self) -> bool { true }
}
impl Permission for Guest {
fn can_delete(&self) -> bool { false }
}
fn main() {
let user1 = Admin;
let user2 = Guest;
println!("Admin can delete? {}", user1.can_delete());
println!("Guest can delete? {}", user2.can_delete());
}
👉 여기서 Admin, Guest는 필드가 없는 단위 구조체이지만 타입만으로 역할을 구분합니다. 매우 강력한 타입 시스템 응용입니다.
PhantomData와 함께 사용use std::marker::PhantomData;
struct Wrapper<T> {
_marker: PhantomData<T>,
}
👉 실제 데이터는 없지만, 타입 T에 대한 의존성을 명시하고자 할 때 사용됩니다.
enum과 함께 상태 관리enum State {
Start,
InProgress,
Done,
}
각 상태가 데이터를 가지지 않는 경우, 내부적으로는 unit-like 구조체와 비슷한 형태로 취급됩니다.
| 형태 | 예시 | 설명 |
|---|---|---|
| 필드 없는 구조체 | struct Foo; | 타입 구분, 마커 용도, 상태 표현, 트레이트 디스패치 등에 사용 |
| 필드 없는 enum variant | enum MyState { Init, Done } | 상태 머신 등에서 유용 |
궁극적으로, **필드 없는 구조체는 '의미만 있는 껍데기'**로 쓰이며, Rust의 강력한 타입 시스템을 활용한 안전성과 명시성을 위해 매우 유용하게 쓰입니다. 필요하시면 실전 예제 더 보여드릴 수도 있어요!