유사 유닛 구조체(tuple struct)는 Rust에서 다음과 같은 문법으로 정의하는 구조체입니다:
struct Color(u8, u8, u8);
이는 일반 구조체와 달리 필드 이름 없이 위치(index)로 접근하는 구조체이며,
**유닛 구조체(unit struct)**는 필드가 아예 없는 구조체 (struct Empty;)입니다.
예를 들어 u32가 여러 개 쓰이는 상황에서 의미를 구분하고 싶을 때 유용합니다:
struct UserId(u32);
struct OrderId(u32);
fn get_user_name(id: UserId) { /* ... */ }
let id = UserId(5);
// get_user_name(OrderId(5)); // ❌ 타입이 달라서 컴파일 에러
👉 이처럼 *"같은 자료형이라도 의미가 다른 데이터"*를 안전하게 구분할 수 있습니다.
기존 타입에 대해 기능을 추가하고 싶을 때도 씁니다:
struct Meters(f64);
impl Meters {
fn to_cm(&self) -> f64 {
self.0 * 100.0
}
}
→ f64 타입에 기능을 붙이고, 외부에서 직접 .0으로 접근하지 않는 방식으로 캡슐화할 수 있습니다.
예: RGB 색상
struct Color(u8, u8, u8);
let red = Color(255, 0, 0);
단순한 데이터 묶음을 만들고 싶을 때 이름 붙이는 게 불필요하게 장황하면 튜플 구조체가 간결합니다.
튜플과 비슷하게 다루되, 구조체 이름을 통해 의미를 부여하고 타입 체크를 강화할 수 있습니다.
fn scale(color: Color, factor: u8) -> Color {
Color(color.0 / factor, color.1 / factor, color.2 / factor)
}
복잡한 데이터에는 일반 구조체가 낫습니다:
struct Color {
red: u8,
green: u8,
blue: u8,
}
| 용도 | 설명 |
|---|---|
| 타입을 새로 만들고 싶을 때 | UserId(u32) 처럼 의미 있는 타입 정의 |
| 기존 타입 래핑 (newtype) | 기능 추가, 캡슐화 용도 |
| 단순한 구조 표현 | RGB처럼 이름 붙일 필요가 없는 단순 자료 묶음 |
| 튜플처럼 쓰되 타입 안정성 확보 | 튜플의 단순성 + 구조체의 타입 안정성 |
필요하다면 일반 구조체와 유사 유닛 구조체 중 어느 쪽이 더 나은지 구체적인 예를 들어 비교해드릴 수도 있습니다.