코틀린으로 짜여진 소스 코드를 보다 보면 종종 인라인 함수에 reified가 명시된 것을 볼 수 있습니다. 그때마다 reified가 어떤 용도로 쓰이길래, 매번 같이 구현되어 있는지가 궁금하여, 오늘은 reified를 사용하는 이유를 정리해 봤습니다.
1. reified란?
코틀린에서 reifed는 인라인 함수 내에서 타입 매개변수의 실제 타입을 알 수 있도록 하는 기능입니다. 이 말을 좀 더 풀어서 설명드리면 인라인 함수의 경우, 컴파일을 하는 시점에서 함수를 호출하는 지점에 함수 코드를 복사하여 삽입하는 기능을 제공하고 있습니다. 이러한 인라인 함수는 제네릭 타입 매개 변수를 가질 수 있으나, 컴파일 시점에는 해당 타입 정보가 소실되버립니다. 이 때문에 일부 제네릭 함수는 타입 매개변수의 실제 타입을 알 수 없는 경우가 있습니다.
이를 해결하기 위해 reified 키워드를 사용하는데요. 해당 키워드를 사용하게 되면 인라인 함수 내에서 타입 매개변수의 실제 타입을 알 수 있도록 할 수 있습니다. 이를 통해 런타임 시점에 타입 캐스팅을 할 필요가 없어지므로 코드를 더 간결하고 안전하게 작성할 수가 있습니다.
2. reified 사용 예제
위 설명만을 듣고도 아직까지 감이 안오셨을 분들을 위해 예제를 알아보도록 하겠습니다. 아래 예제는 타입 매개변수 T(someValue)가 무엇인지 모르기 때문에, 런타임 시점에 타입 캐스팅을 수행해야 합니다. 이를 방지하고 싶을 경우, 아래와 같이 inline의 reified 키워드를 붙여서 구현할 수 있습니다.
fun <T> myFunction(someValue: T) {
if (someValue is String) {
println("String: $someValue")
} else if (someValue is Int) {
println("Int: $someValue")
}
}
inline fun <reified T> myFunction(someValue: T) {
if (someValue is String) {
println("String: $someValue")
} else if (someValue is Int) {
println("Int: $someValue")
}
}
이렇게 하면 인라인 함수 내에서 T의 실제 타입을 알기 때문에, 런타임 시점에 타입 캐스팅을 수행할 필요가 없어지게 됩니다. reified 키워드를 붙였을 때, 실제 타입을 알 수 있는 이유는, 컴파일러가 인라인 함수의 복사본을 만들 때, 타입 매개변수에 대한 실제 타입 정보를 포함하도록 합니다. 좀 더 풀어서 설명드리면 reified 키워드는 컴파일러에게 제네릭 타입 매개변수의 실제 타입을 알려줍니다. 이 때문에 reified 키워드를 사용하는 제네릭 함수는 컴파일러가 함수를 복사할 때, 타입 매개변수의 실제 타입을 함수 코드에 포함시킵니다. 이러한 처리 과정은 컴파일 시점에서 수행됩니다.
따라서 inline과 reified를 함께 사용하면, 제네릭 함수 내에서 타입 매개변수의 실제 타입을 알 수 있고, 이를 통해 더 안전하고 간결한 코드 작성이 가능합니다.
'IT' 카테고리의 다른 글
JSON, JsonObject, JsonArray의 차이 (0) | 2023.03.23 |
---|---|
Spring Data JPA - 데이터 뻥튀기 (일대다 관계 조인) (0) | 2023.03.14 |
Jackson ObjectMapper란? (0) | 2023.03.08 |
엘지 유플러스 공유기 PC 원격 실행 설정 방법(윈도우10, won)(23년 최신) (0) | 2023.03.06 |
New Bing AI에 대해서 알아보자. (1) | 2023.03.05 |
댓글