WIPIVERSE

타입 소거

타입 소거(type erasure)는 프로그래밍 언어에서 프로그램이 실행 시간(runtime)에 실행되기 전에, 프로그램 내의 명시적 타입 어노테이션(type annotation)이 제거되는 로드 타임(load-time) 프로세스이다. 형 소거 또는 타입 제거라고도 불린다.

이 개념은 프로그래밍 언어 이론과 실제 언어 구현 양쪽에서 모두 사용된다. 이론적 측면에서 타입 소거 의미론(type-erasure semantics)은 프로그램의 런타임 실행이 타입 정보에 의존하지 않도록 보장하는 추상화 원칙으로, 프로그램에 타입이 동반될 필요가 없는 동작적 의미론(operational semantics)을 가리킨다. 이는 타입 정보가 런타임까지 유지되는 타입 통과 의미론(type-passing semantics)과 대조된다.

실제 언어 구현에서 가장 널리 알려진 사례는 Java의 제네릭스(Generics)이다. Java는 2004년 JDK 5.0에서 제네릭스를 도입하면서 하위 호환성을 유지하기 위해 타입 소거 방식을 채택했다. Java 컴파일러는 소스 코드에서 제네릭 타입 매개변수(예: List<String>의 <String>)를 검증한 후, 컴파일 과정에서 이 타입 정보를 제거(소거)하고 바운드 타입(bound type) 또는 Object로 대체한다. 그 결과, 런타임 시점의 JVM(Java Virtual Machine)은 제네릭 타입 정보를 알 수 없으며, instanceof 연산자로 제네릭 타입을 검사할 수 없고, 제네릭 배열을 직접 생성할 수 없는 등의 제약이 발생한다.

C++에서는 타입 소거(type erasure)가 디자인 패턴의 일종으로 사용되기도 하며, std::any, std::function 등이 다양한 구체 타입을 통일된 인터페이스로 처리하기 위해 내부적으로 타입 정보를 숨기는 방식을 채택하고 있다. 이는 상속 없이도 다형성을 구현하는 기법으로 활용된다.

타입 소거의 반대 개념은 실체화(reification)라고 불리며, 타입 정보를 런타임까지 유지하는 방식을 의미한다. C#의 제네릭스는 실체화 방식의 대표적인 예시이다. 타입 소거의 역연산은 타입 추론(type inference)이라고 불린다.

타입 소거는 프로그래밍 언어 이론 및 컴파일러 설계 분야에서 널리 연구되고 실제 구현에도 적용된 정립된 개념이다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기