BE/Kotlin

[Kotlin] as? 와 null 형변환

baek-dev 2025. 3. 27. 18:38

코틀린의 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