코틀린에서 타입 정보는 기본적으로 런타임에 제거됩니다. 이는 자바의 타입 소거(type erasure) 방식 때문입니다. 따라서 일반적인 제네릭 함수 내에서는 해당 타입에 대한 실제 클래스 정보를 얻을 수 없습니다.
reified
키워드는 이 문제를 해결하기 위해 코틀린에서 제공됩니다. reified
를 사용하면, 제네릭 타입 파라미터에 실제 타입 정보를 유지할 수 있게 됩니다. 하지만 이 기능은 inline
함수에서만 사용할 수 있습니다.
이는 inline
함수의 본문이 호출 위치에 직접 삽입되면서 실제 타입 정보를 함께 가져와서 사용할 수 있게 되기 때문입니다.
가상 시나리오
웹 애플리케이션에서 여러 타입의 객체를 JSON으로 직렬화해야 하는 상황이 생겼다고 가정합시다. 그 중 특정 타입의 객체만 직렬화하는 로직을 추가하려고 합니다. reified
를 사용하면 이를 유연하게 처리할 수 있습니다.
예시 코드
import com.fasterxml.jackson.databind.ObjectMapper
// 임의의 데이터 클래스들
data class Person(val name: String, val age: Int)
data class Book(val title: String, val author: String)
inline fun <reified T> toJson(data: T): String? {
if (T::class == Person::class) { // reified 덕분에 T의 실제 타입 정보에 접근 가능
val objectMapper = ObjectMapper()
return objectMapper.writeValueAsString(data)
}
return null // Person 타입이 아니면 null 반환
}
fun main() {
val person = Person("Alice", 30)
val book = Book("Kotlin in Action", "Some Author")
println(toJson(person)) // 실제 JSON 형태로 출력됩니다.
println(toJson(book)) // null이 출력됩니다.
}
위 코드에서 toJson
함수는 제네릭 타입 T
를 가지고 있지만, reified
키워드 덕분에 해당 타입이 Person
인지 여부를 체크할 수 있습니다.
주의사항
reified
는inline
함수에서만 사용할 수 있습니다. 그 이유는,inline
함수가 호출되는 곳에 직접 코드가 삽입되면서 해당 타입 정보를 가져올 수 있기 때문입니다.reified
를 사용하더라도 전체 타입 파라미터가 런타임에 모두 보존되는 것은 아닙니다. 단지 함수 내에서 해당 타입을 접근할 수 있을 뿐입니다.
728x90
'Language > Kotlin' 카테고리의 다른 글
DSL (Domain-Specific Language)이란? | feat. Kotlin DSL, build.gradle.kts 예시 코드) (0) | 2023.09.13 |
---|---|
Gradle, Spring, Kotlin 환경에서의 build.gradle.kts 내 tasks 이해하기 (0) | 2023.09.13 |
Inline 함수란? (0) | 2023.09.04 |
코틀린의 `joinToString()`: 모든 것을 알아보자 (0) | 2023.08.31 |
Kotlin에서의 꼬리 재귀와 피보나치 수열 (0) | 2023.08.29 |