Kotlin

[Kotlin] reified 키워드

Nhahan 2025. 4. 3. 20:00

reified 키워드는 코틀린에서 인라인 함수의 타입 파라미터에 붙여서, 해당 타입 정보를 런타임에도 유지하도록 하는 키워드다. 기본적으로 코틀린의 제네릭은 타입 소거(type erasure) 때문에 런타임에 구체적인 타입 정보를 알 수 없지만, reified를 사용하면 인라인 함수 내부에서 타입 파라미터를 실제 타입처럼 사용할 수 있게 된다.

 

예를 들어, 일반 함수에서는 아래와 같이 제네릭 타입 파라미터를 사용할 때, 타입 정보를 알 수 없으므로 is 연산자나 ::class 등을 사용할 수 없다.

// 일반적인 제네릭 함수 (타입 소거 때문에 T의 구체적 타입을 알 수 없음)
fun <T> isInstance(value: Any): Boolean {
    // 컴파일 에러: 'T'의 구체적인 타입 정보를 알 수 없으므로 is 연산자를 사용할 수 없음.
    // return value is T
    return false 
}

 

하지만, 만약 이 함수를 인라인 함수로 선언하고 타입 파라미터를 reified로 표시하면, 컴파일러가 함수의 본문을 호출한 곳에 삽입하면서 T의 실제 타입 정보를 대체하게 되어 런타임에도 T의 타입 정보를 알 수 있게 된다.

// reified를 사용한 인라인 함수
inline fun <reified T> isInstance(value: Any): Boolean {
    return value is T  // 여기서 T는 실제 타입으로 대체됨
}

fun main() {
    println(isInstance<String>("Hello"))  // 출력: true
    println(isInstance<Int>("Hello"))     // 출력: false
}

위 예제에서 isInstance 함수는 호출 시점에 T의 실제 타입(예: String 또는 Int)이 대입되므로, value is T 검사에서 올바르게 작동한다.

 

또 다른 예로, 리플렉션 API에서 findAnnotation 함수는 다음과 같이 정의할 수 있다.

inline fun <reified T> KAnnotatedElement.findAnnotation(): T? =
    annotations.filterIsInstance<T>().firstOrNull()

여기서 reified 덕분에 T가 런타임에도 구체적인 타입으로 남아 있어, filterIsInstance<T>()를 통해 해당 타입의 애노테이션을 정확히 필터링할 수 있다.