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 |
댓글