타입 별칭

타입 별칭 (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)