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>()를 통해 해당 타입의 애노테이션을 정확히 필터링할 수 있다.
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin in Action] 10.2 리플렉션: 실행 시점에 코틀린 객체 내부 관찰 (0) | 2025.04.03 |
---|---|
[Kotlin in Action] 10.1 annotation 선언과 적용 (0) | 2025.04.03 |
[Kotlin] 스타 프로젝션(*)과 Any의 차이 (0) | 2025.04.03 |
[Kotlin] 코틀린 선언 지점 변성과 자바 와일드카드 비교 (0) | 2025.04.03 |
[Kotlin in Action] 9.3 변성: 제네릭과 하위 타입 (0) | 2025.04.02 |
댓글