Kotlin에서 as 연산자는 명시적 타입 변환(cast)을 위해 사용됩니다. 두 가지 변형이 있습니다: as와 as?. 첫 번째는 예외를 발생시키고, 두 번째는 더 안전합니다. 이 도구는 다형성과 데이터마이그레이션, 외부 API와의 상호작용에서 중요합니다.
Java에서는 타입 변환 시 (TargetType)obj 캐스트 연산자를 사용하며, 오류가 발생할 경우 ClassCastException을 던집니다. Kotlin은 이 개념을 발전시켜 안전한 캐스트(as?)를 추가하여 nullability와 런타임 오류를 더 편리하고 명시적으로 관리할 수 있게 했습니다.
대규모 프로젝트에서 강한 타입 변환은 위험합니다: 타입이 일치하지 않으면 프로그램이 급작스럽게 종료됩니다(ClassCastException). 이러한 행동을 최소화하기 위해 무음 오류 또는 NPE 없이 적절하게 오류를 처리해야 합니다. 오류가 처리되어야 하는 상황과 단순히 null을 반환해야 하는 상황을 명확히 구분하는 것이 중요합니다.
Kotlin은 두 가지 연산자를 제공합니다:
as: 강한 타입 변환으로, 타입이 일치하지 않으면 ClassCastException을 던집니다.as?: 안전한 변환으로, 변환이 불가능할 경우 null을 반환합니다.val x: Any = "Hello, Kotlin!" val s1: String = x as String // 정상, x는 String입니다. val s2: String? = x as? String // 정상, x는 String입니다. val n: Int? = x as? Int // n = null, 안전한 캐스트
as는 오류 시 ClassCastException을 던집니다.as?는 null을 반환하여 비상 오류를 최소화합니다.'as'는 런타임에 항상 타입을 체크하나요?
네, 만약 캐스트가 호환되지 않는 타입 간에 발생하면 ClassCastException이 발생합니다. 하지만 Int와 Float 사이의 비명시적 변환과 같은 경우에는 변환이 발생하지 않으며, Kotlin의 메서드에 의한 관용적 변환(toInt, toFloat)이 이루어집니다.
nullable 타입을 not-null 타입으로 'as' 사용할 수 있나요?
네, 하지만 주의해야 합니다: 만약 값이 null이라면 예외가 발생합니다. nullability 체크 없이 nullable 타입을 non-nullable로 캐스트하면 런타임 오류를 초래할 수 있습니다.
val x: String? = null val y: String = x as String // ClassCastException 발생!
'is'와 'as'의 차이는 무엇인가요?
'is'는 타입을 체크하는 연산자입니다. true/false를 반환하며 타입을 변환하지 않습니다. 'as'는 실제로 타입을 변환하며, 변환할 수 없는 경우 예외를 던지거나 ('as?'를 사용할 경우) null을 반환합니다. 이 둘은 종종 함께 사용되어 안전한 변환을 수행합니다:
if (x is String) { val s: String = x // 스마트 캐스트 }
as를 무모하게 사용하여 ClassCastException이 발생하는 경우.데이터 파싱 모듈에서 모든 객체가 as를 통해 파싱됩니다. 예를 들어, obj as Double. 데이터가 잘못된 경우 — 애플리케이션은 ClassCastException으로 다운됩니다.
장점:
단점:
스마트 캐스트(is를 통해) 또는 안전한 캐스트(as?)가 사용됩니다:
val price = (obj as? Double) ?: 0.0
장점:
단점: