본문 바로가기
Kotlin

[Kotlin] inline 사용법 (2) - reified 사용법

by 노력남자 2023. 8. 15.
반응형

이번 포스팅에선 reified 소개와 활용법에 대해 알아보겠다.

 

제네릭 함수 타입 소거란?

 

reified를 소개하기 전에 제네릭 함수 타입 소거에 대해 먼저 알아보고 가자.

 

제네릭 함수는 컴파일되면 타입이 소거된다.

 

아래 swap 함수가 컴파일되면?

 

fun <T> swap(a: T, b: T): Pair<T, T> {
    return b to a
}

 

타입 정보가 제거되고 Object로 바뀐다. 이걸 타입 소거라고 한다.

 

 

타입 소거의 문제점

 

제네릭 함수는 컴파일되면 제네릭 타입이 소거되기 때문에 런타임에서 타입 정보를 알 수가 없다.

 

무슨 말이냐면, 아래와 같이 타입 파라미터 T의 클래스를 찍고 싶어도 찍을 수가 없다는 말이다.

 

Cannot use 'T' as reified type parameter. Use a class instead 에러가 발생한다.

 

 

reified를 적용해서 해결하자

 

reified는 실체화, 구체화라는 뜻이다.

 

reified는 제네릭 타입 파라미터에 사용되며, 런타임에 제네릭 타입을 사용할 수 있게 해준다.

 

reified를 사용하려면 반드시 inline function이어야 한다.

 

inline을 붙여주고 타입 파라미터 앞에 reified를 붙여주면 끝이다.

 

 

어떻게 저게 가능한지 컴파일해서 봤더니 function 안에 변수를 만들어 클래스 정보를 담아서 해결했네

 

 

reified 활용법

 

이제 reified를 왜 쓰는지, 어떻게 작동하는지 알았는데 도대체 이걸 어디에 쓰는 건지 알아보자.

 

런타임 클래스 생성

 

inline fun <reified T : Any> createInstance(): T {
    return T::class.java.newInstance()
}

val instance: MyClass = createInstance<MyClass>()

 

타입 확인과 캐스팅

 

inline fun <reified T> List<Any>.filterIsInstance(): List<T> {
    return this.filter { it is T }.map { it as T }
}

val mixedList = listOf<Any>(1, "two", 3, "four")
val stringList: List<String> = mixedList.filterIsInstance<String>()
반응형

댓글