본문 바로가기
Language/Kotlin

`reified`란?

by 시니성 2023. 9. 4.

코틀린에서 타입 정보는 기본적으로 런타임에 제거됩니다. 이는 자바의 타입 소거(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인지 여부를 체크할 수 있습니다.

주의사항

  • reifiedinline 함수에서만 사용할 수 있습니다. 그 이유는, inline 함수가 호출되는 곳에 직접 코드가 삽입되면서 해당 타입 정보를 가져올 수 있기 때문입니다.
  • reified를 사용하더라도 전체 타입 파라미터가 런타임에 모두 보존되는 것은 아닙니다. 단지 함수 내에서 해당 타입을 접근할 수 있을 뿐입니다.