reified는 Kotlin 개발자가 런타임(runtime)에 클래스와 관련된 정보에 접근할 수 있도록 도와주는 특수 키워드입니다. 중요한 점은 reified가 inline 함수와 함께 사용될 때만 유효하다는 것입니다.
reified 키워드가 적용되면 컴파일러는 해당 함수의 바이트코드(bytecode)를 함수가 호출되는 모든 코드 영역에 복사합니다. 이러한 방식 덕분에 제네릭 타입 T는 실제로 인자로 전달된 값의 타입으로 할당되며, 런타임에도 타입 정보를 그대로 활용할 수 있습니다.
예제
다음 예제를 통해 reified가 코드 재사용에 얼마나 유용한지 확인해 보겠습니다. 전달되는 인자의 타입과 무관하게 하나의 함수로 동일한 종류의 작업을 수행할 수 있습니다.
이 예제에서는 inline 함수를 선언하고 제네릭 reified 타입 인자 T를 전달합니다. 그리고 Kotlin의 main() 함수에서 서로 다른 인자를 사용해 myExample()을 여러 번 호출합니다.
// Inline 함수 선언
inline fun <reified T> myExample(name: T) {
println("\nName of your website -> "+name)
println("\nType of myClass: ${T::class.java}")
}
fun main() {
// String 타입으로 func() 호출
myExample<String>("www.tutorialspoint.com")
// Int 값으로 func() 호출
myExample<Int>(100)
// Long 값으로 func() 호출
myExample<Long>(1L)
}실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
Name of your website -> www.tutorialspoint.com Type of myClass: class java.lang.String Name of your website -> 100 Type of myClass: class java.lang.Integer Name of your website -> 1 Type of myClass: class java.lang.Long
정리
reified를 사용하면 일반적인 제네릭에서는 불가능한 T::class.java와 같은 타입 검사가 가능해집니다. 이는 JVM의 타입 소거(type erasure) 문제를 inline 함수의 코드 복사 방식으로 우회하기 때문입니다. 따라서 런타임에 제네릭 타입 정보가 필요한 경우 reified 키워드를 활용하는 것이 좋습니다.