타입 별칭
타입 별칭 (Type aliases)
코드를 읽을 때 의미를 드러내기 위해 긴 타입에 짧고 명확한 이름을 붙이고 싶을 때가 있어요. Rust의 타입 별칭(type alias) 은 바로 그런 용도로, type 키워드로 기존 타입에 새 이름을 붙여 주는 기능이에요. 어떤 규칙으로 쓰고, 어떤 제약이 있는지 살펴볼게요.
출처: Rust Reference
본문
구문 (Syntax)
TypeAlias →
type IDENTIFIER GenericParams? ( : Bounds? )?
WhereClause?
( = Type WhereClause? )? ;
개념 (Intro)
타입 별칭은 그 별칭이 위치한 모듈이나 블록의 타입 네임스페이스(type namespace) 에 기존 타입을 위한 새 이름을 정의해요. type 키워드로 선언하죠. 모든 값은 하나의 구체적인 타입을 가지지만, 여러 트레이트를 구현할 수도 있고 여러 타입 제약과 호환될 수도 있어요.
예를 들어 다음 코드는 (u8, u8) — 부호 없는 8비트 정수 쌍의 타입 — 에 Point라는 동의어를 붙여 줘요.
#![allow(unused)]
fn main() {
type Point = (u8, u8);
let p: Point = (41, 68);
}
생성자 별칭 제약 (Constructor alias)
튜플 구조체(tuple-struct)나 유닛 구조체(unit-struct)에 대한 타입 별칭은 그 타입의 생성자를 한정(qualify) 하는 데 쓸 수 없어요.
#![allow(unused)]
fn main() {
struct MyStruct(u32);
use MyStruct as UseAlias;
type TypeAlias = MyStruct;
let _ = UseAlias(5); // OK
let _ = TypeAlias(5); // Doesn't work
}
연관 타입과의 관계 (Associated types)
타입 별칭은 쓰이는 위치에 따라 요구사항이 달라져요.
- 연관 타입으로 쓰이지 않을 때에는 반드시
Type을 포함해야 하고,Bounds는 포함할 수 없어요. - 트레이트 안에서 연관 타입으로 쓰일 때에는
Type명시를 포함하면 안 되고,Bounds는 포함할 수 있어요. - 트레이트 구현(impl) 안에서 연관 타입으로 쓰일 때에는 반드시
Type명시를 포함해야 하고,Bounds는 포함할 수 없어요.
권장되는 where 절 위치 (Where clauses)
트레이트 impl 안 타입 별칭에서 등호 앞에 오는 where 절(예: type TypeAlias<T> where T: Foo = Bar<T>)은 더 이상 권장되지 않아요(deprecated). 등호 뒤에 오는 형태(예: type TypeAlias<T> = Bar<T> where T: Foo)를 선호해요.
더 알아보기 (Learn more)
- 아이템 (Items) — 타입 별칭이 속한 아이템 전체 개요
- 연관 아이템 (Associated items) — 트레이트 안의 연관 타입
- 타입 시스템 (Types) — 별칭으로 가리키는 타입 자체에 대한 설명