본문 바로가기
Kotlin

[Kotlin] reified 키워드

by Nhahan 2025. 4. 3.

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>()를 통해 해당 타입의 애노테이션을 정확히 필터링할 수 있다.

 

반응형

댓글