코틀린의 as? 연산자와 안전한 널(null) 형변환
코틀린에서는 형변환(Type Casting) 을 위해 as 연산자를 사용하지만, 형변환이 실패할 경우 런타임 오류(ClassCastException)가 발생할 수 있음.
이를 방지하기 위해 안전한(null-safe) 형변환 연산자인 as? 를 제공함.
1. as 연산자 (일반적인 형변환)
기본적으로 as 연산자는 한 객체를 특정 타입으로 변환하려고 할 때 사용됨.
val obj: Any = "Hello"
val str: String = obj as String // 성공
println(str) // Hello
하지만, 형변환이 불가능한 경우 런타임 오류가 발생함.
val obj: Any = 123
val str: String = obj as String // ClassCastException 발생
즉, as 연산자는 형변환이 실패하면 예외(ClassCastException) 를 발생시키기 때문에 조심해서 사용해야 함.
2. as? 연산자 (안전한 널(null) 형변환)
코틀린에서는 형변환이 실패할 경우 예외 대신 null을 반환하는 as? 연산자를 제공함.
val obj: Any = "Hello"
val str: String? = obj as? String // 성공
println(str) // Hello
하지만, 형변환이 불가능한 경우 null이 반환됨.
val obj: Any = 123
val str: String? = obj as? String // 형변환 실패 -> null 반환
println(str) // null
as? 를 사용하면 형변환 실패 시 예외가 발생하지 않으므로 더 안전하게 사용할 수 있음.
3. as? 연산자의 실용적인 활용법
(1) 널 체크와 함께 사용하기
val obj: Any = 100
val str: String? = obj as? String
if (str != null) {
println("변환 성공: $str")
} else {
println("변환 실패: null 반환")
}
출력 결과:
변환 실패: null 반환
(2) ?: 엘비스 연산자와 함께 사용하기
널이 반환될 경우 기본값을 지정할 수 있음.
val obj: Any = 123
val str: String = obj as? String ?: "변환 실패"
println(str)
출력 결과:
변환 실패
(3) let과 함께 안전하게 처리하기
val obj: Any = "Hello"
(obj as? String)?.let {
println("변환 성공: $it")
} ?: println("변환 실패")
출력 결과:
변환 성공: Hello
4. as?를 사용해야 하는 이유
• 런타임 예외를 방지 (ClassCastException 방지)
• 널 안정성 유지 (null 반환을 통해 안전한 처리 가능)
• 깔끔한 코드 유지 (명시적인 널 체크 없이 연산 가능)
5. as? 사용 시 주의할 점
• 불필요한 변환을 피해야 함
as? 를 남발하면 가독성이 떨어질 수 있으므로, 꼭 필요한 경우에만 사용할 것.
• 반환된 null 값을 처리할 수 있어야 함
as? 연산자는 변환 실패 시 null을 반환하므로, 이후 널 체크나 ?: 연산자를 함께 사용하는 것이 좋음.
6. 정리하면:
• as : 형변환 실패 시 예외 발생
• as? : 형변환 실패 시 null 반환 (안전한 변환)
• as? 는 ?: (엘비스 연산자), let 과 함께 사용하면 더 효과적임.
• 런타임 오류를 방지하고, 안전한 코드 작성을 위해 as? 를 적극적으로 활용하는 것이 좋음.
출처 : ChatGPT
'BE > Kotlin' 카테고리의 다른 글
[Kotlin] 비동기 처리 (async, await) (0) | 2025.03.29 |
---|---|
[Kotlin] 코루틴 (Coroutines) (1) | 2025.03.02 |
[Kotlin] 함수형 프로그래밍과 불변성 (0) | 2025.02.24 |
[Kotlin] JPA에서 필드에 final을 붙이지 않는 이유 (val, var) (0) | 2025.02.21 |
[Kotlin] 코틀린 문법 6 (open, 상속, 인터페이스) (0) | 2025.02.20 |