Kotlin/Variable and Function

[Kotlin] 제네릭 사용 시 Cannot check for instance of erased type: T 오류 해결 방법 : inline과 reified를 사용한 문제 해결

Dev.Cho 2024. 4. 3. 07:27

Cannot check for instance of erased type: T 오류는 왜 발생할까?

JVM은 제네릭 타입을 실행 시점에 지원하지 않기 때문에, 자바의 제네릭과 마찬가지로 코틀린의 제네릭 또한 컴파일 타입에 타입 지워짐(Type Erasure)이 발생한다. 이 때문에 제네릭을 사용하는 일반 함수에서는 함수 본문에서 제네릭 타입을 이용해 연산을 할 수 없다. 예를 들어 다음과 isType 함수를 살펴 보자.

fun <T> isType(value: Any): Boolean {
  return value is T
}

 

이 함수는 겉보기에는 문제가 없어 보인다. 하지만, T라는 타입은 컴파일 시점에 지워지고, 실행 시점에는 T가 무슨 타입인지 알 수 없기 때문에 다음과 같은 오류가 발생한다.

그림1. 제네릭 타입 오류

 

Cannot check for instance of erased type: T
지워진 타입 T의 인스턴스를 확인할 수 없습니다.

 

그렇다면 이 문제를 해결하기 위해서는 어떻게 해야할까?

 

inline fun과 reified를 사용한 문제 해결

이 문제를 해결하기 위해서는 실행 시점에 제네릭 타입 정보를 유지해야 한다. 이를 위해서는 제네릭 타입을 구체 타입(reified)으로 선언하고 함수를 inline 함수로 선언해 런타임에 타입 정보에 접근할 수 있도록 해야 한다. 즉, 위의 코드를 다음과 같이 바꾸면 된다.

inline fun <reified T> isType(value: Any): Boolean {
  return value is T
}

 

그러면 이제 오류가 사라지는 것을 확인할 수 있다.

 

위 코드가 잘 동작하는지 확인하기 위해 다음 코드를 실행해보자.

fun main() {
  val string = "Test String"
  val isString = isType<String>(string)
  println(isString)
}

 

그러면 다음과 같이 코드의 실행이 성공하는 것을 확인할 수 있다.

그림2. 실행 성공

 

 

반응형