2015-07-24

Phantom type - 구체화 되지 않는 타입 추가하기

 Phantom type은 받은 타입 파라미터 중에서 구조체의 선언에 기여하지 않는 타입 파라미터가 존재하는 타입을 말한다. 무언가 존재하는 것 같지만, 만져지는 실체가 없는 것이 유령 같다고 하여 phantom type이라고 불린다.

 내가 알기로는 Haskell에서 가장 먼저 도입된 것으로 알고 있다. Haskell이 phantom type을 사용하기 시작한 뒤로 파라메트릭 폴리몰피즘을 중시하며 강타입 타입 시스템을 가진 Scala나 Rust 같은 다른 언어에서도 사용된다.

 보통 phantom type을 사용하는 이유는 런타임 오버헤드 없이 컴파일 타임에 제약 조건을 추가하기 위해서다. phantom type에 사용된 타입 파라미터는 구조체의 값으로 사용되지 않기 때문에 구조체의 크기를 증가시키거나, 실행 시에 별도의 정보를 더 들고 다니지 않는다. 그저 컴파일 타임에 타입 체크하는 조건을 강화할 뿐이다.

이에 대한 좋은 예제가 rust by example에 있어서 가지고 왔다.1)

 위의 예제는 Length라는 구조체를 단위를 타입 파라미터로 받는 클래스로 선언하였다. 하지만 단위에 해당하는 UnitLength 구조체의 어떤 값으로도 사용되지 않는다. 따라서 Length 구조체의 크기는 f64의 크기와 같다.2) 하지만 Length<Mm>Length<Inch>와 다른 값이기 때문에 Length<Mm> 타입인 값과 Length<Inch> 타입인 두 값을 더할 수 없다.


1) 예제 코드는 Apache 2.0 라이센스로 배포되는 rust by example에 나오는 예제를 가지고 왔다.
2) rust는 구조체에 기여하지 않는 타입 파라미터를 만들 수 없어 PhantomData를 이용했다. PhantomData는 size가 0인 구조체이다.

댓글 없음:

댓글 쓰기