본문 바로가기
Blog/TIL

2025-02-18 (화)

by 코젼 2025. 2. 18.
728x90
반응형

2025-02-18 (화)

📌 TIL (Today I Learned) - Kotlin @Suppress("UNCHECKED_CAST")와 제네릭 활용

🎯 오늘의 결론

@Suppress("UNCHECKED_CAST")는 필요할 때만 사용하고, 남용하지 말자.
제네릭을 활용하면 UNCHECKED_CAST 없이 안전한 코드 작성 가능.
reified 키워드를 활용하면 런타임에서도 타입 안정성을 유지할 수 있음.

💡 결론: 제네릭을 적극 활용하여 타입 안정성을 높이고, 불필요한 @Suppress 사용을 줄이자! 🚀


🚀 1. @Suppress("UNCHECKED_CAST")

  • Kotlin에서 캐스트 관련 경고를 억제하는 어노테이션.
  • 주로 제네릭 타입 변환 시 발생하는 UNCHECKED_CAST 경고를 숨길 때 사용됨.
  • 남용할 경우 런타임에서 ClassCastException이 발생할 위험이 있음.

✅ 예제 (경고 발생)

fun getData(): Any {
    return listOf("A", "B", "C")
}

fun main() {
    val list = getData() as List<Int> // Unchecked cast: Any to List<Int> 경고 발생
    println(list)
}
  • getData()Any를 반환하므로, as List<Int>로 캐스트할 때 컴파일러가 안전성을 보장할 수 없음.

@Suppress("UNCHECKED_CAST") 적용

@Suppress("UNCHECKED_CAST")
fun getSafeData(): List<Int> {
    return getData() as List<Int> // 이제 경고가 발생하지 않음
}
  • 경고는 사라지지만, 실제 실행 시 ClassCastException이 발생할 위험이 있음.
  • 더 안전한 해결책이 필요함!

🚀 2. UNCHECKED_CAST 해결을 위한 제네릭 활용

제네릭을 사용하면 UNCHECKED_CAST 경고 없이 타입 안정성을 유지할 수 있음.

✅ 안전한 제네릭 활용 방법

fun <T> getGenericData(): List<T> {
    return listOf("A", "B", "C") as List<T> // 타입 안정성 유지
}

fun main() {
    val list: List<String> = getGenericData() // 안전한 방식
    println(list)
}
  • 제네릭을 사용하면 컴파일러가 타입을 추론할 수 있어 UNCHECKED_CAST 경고가 발생하지 않음.
  • 런타임 예외 발생 가능성이 줄어듦.

    🚀 3. reified를 활용한 안전한 캐스팅

Kotlin의 reified 키워드를 사용하면 런타임에 제네릭 타입 정보를 유지할 수 있음.

✅ 안전한 타입 변환 함수

inline fun <reified T> Any?.safeCast(): T? {
    return this as? T
}

fun main() {
    val data: Any = listOf("A", "B", "C")
    val safeList: List<String>? = data.safeCast<List<String>>() // 안전한 변환
    println(safeList) // [A, B, C]
}
  • as? 연산자를 사용하여 캐스트가 실패하면 null을 반환ClassCastException 방지.
  • 제네릭 타입 정보를 유지하여 보다 안전한 캐스팅 가능.
728x90
반응형

'Blog > TIL' 카테고리의 다른 글

2025-02-20 (목)  (0) 2025.02.20
2025-02-19 (수)  (0) 2025.02.19
2025-02-17 (월)  (0) 2025.02.17
2025-02-14 (금)  (0) 2025.02.14
2025-02-13 (목)  (2) 2025.02.13

댓글