320x100
320x100

뉴타입 (newtype)

- 외부 타입에 외부 트레이트를 구현하기 위해 새로운 래퍼 타입을 만드는 방법

- 고아 규칙 (Orphan Rule): “트레이트나 타입 중 하나는 현재 크레이트에 속해야 함”에 대해 래퍼 타입을 만들어 우회

- 런타임 오버헤드 없음 (컴파일 시 제거됨)

 

이 외에도 어떤 타입의 구현 세부 사항을 추상화 하는데에도 사용 가능

뉴타입은 비공개 내부 타입의 API와는 다른 공개 API를 노출할 수 있음

 

 

 

 

타입 별칭으로 타입의 동의어 만들기

러스트는 타입 별칭을 선언하여 기존 타입에 다른 이름을 부여하는 기능을 제공

이를 위햐서는 type 키워드를 사용함

type Thunk = Box<dyn Fn() + Send + 'static>;

let f: Thunk = Box::new(|| println!("hi"));

fn takes_long_time(f: Thunk) {
}

fn returns_long_type() -> Thunk {
}

 

 

 

 

절대 반환하지 않는 부정 타입

러스트에는 !라는 특수한 타입이 있는데,

이 타입은 값이 없기 때문에 이론 용어로는 빈 타입이라고 알려져 있음

함수가 절대 반환하지 않을 때 반환 타입을 대신하기 때문에 부정 타입(never type)이라고 부르는 쪽이 선호됨

부정 타입은 panic! 매크로와 함께 유용하게 쓰임 (panic! 매크로가 ! 타입을 가지고 있기 때문)

fn bar() -> ! {
}

 

 

 

 

동적 크기 타입과 Sized 트레이트

러스트는 특정 타입의 값에 할당할 공간의 크기 등 타입에 대한 특정 세부 사항을 알아야함

이로 인해 동적 크기 타입(DST, Dynamiccaly Sized Type)에 대한 개념이 모호함

DST 또는 크기가 지정되지 않은 타입(unsized type) 이라고도 하는 이러한 타입을 사용하면 런타임에만 크기를 알 수 있는 값을 사용하여 코드를 작성할 수 있음

fn generic<T: ?Sized>(t: &T) {
}

 

?Sized 트레이트 바운드는 'T는 Sized 일 수도 있고 아닐 수도 있다'는 의미를 가지며

이 문법은 제네릭 타입이 컴파일 시점에 크기가 알려진 타입이어야 한다는 기본 값을 덮어씀

이런 의미의 ?Trait 문법은 Size에만 사용할 수 있고 다른 어떤 트레이트에도 사용할 수 없음

또한 타입이 Sized가 아닐 수 있기 때문에 어던 종류의 포인터 뒤에 놓고 사용해야함 (&T)

 

 

300x250
728x90

'Programming > Rust' 카테고리의 다른 글

러스트 매크로  (0) 2025.10.12
러스트 고급 함수와 클로저  (0) 2025.10.12
러스트 고급 트레이트  (0) 2025.10.12
안전하지 않은 러스트  (0) 2025.10.12
러스트 패턴과 매칭  (0) 2025.10.11