참고 : Kotlin Docs
https://kotlinlang.org/docs/typecasts.html
코드 실행 중에 객체의
타입을 확인할 수 있다.
is와 !is 연산자is로 객체의 타입 확인하기if (obj is String) {
print(obj.length)
}
obj 객체가
String 타입인지 확인한다. String이면 true, 아니면 false 를 return한다.
!is로 객체의 타입 확인하기if (obj !is String) { // Same as !(obj is String)
print("Not a String")
} else {
print(obj.length)
}
obj 객체가
String 타입이 아닌지 확인. String이면 false, 아니면 true 를 return한다.
명시적 캐스팅 연산자를 사용하지 않아도 된다.fun demo(x: Any) {
if (x is String) {
print(x.length)
}
}
컴파일러가 두 번째 줄 if (x is String)에서
x 가 String 타입인지 체크했기 때문에 print문의 x가 String타입으로자동적으로 캐스팅된다.
|| OR와 && AND 식에서도 사용 가능하다.if (x !is String || x.length == 0) return
if 문의
||왼쪽 식에서 x !is String으로x의 타입을 검사했기 때문에 오른쪽 식의 x는 자동적으로String으로 캐스팅된다.
if (x is String && x.length > 0) {
print(x.length) // x is automatically cast to String
}
if 문의
&&왼쪽 식에서 x is String으로x의 타입을 검사했기 때문에 오른쪽 식의 x는 자동적으로String으로 캐스팅된다.
when expression과 while loop에서도 스마트캐스트가 동작한다.when (x) {
is Int -> print(x + 1)
is String -> print(x.length + 1)
is IntArray -> print(x.sum())
}
왼쪽의 is Int에서
x의 타입을 검사했기 때문에 오른쪽의 식에서명시적 타입 캐스팅이 필요하지 않다.
아래의 is String과 is IntArray줄도 마찬가지이다.
타입 캐스팅이 불가능할 경우 캐스팅 연산자는 예외를 호출한다.as 키워드 사용 val x: String = y as String
위 식에서 y가 null이라면, null은 String으로 캐스팅될 수 없기 때문에 이 식은
예외을 호출한다.
null 값을 처리하려면, 검사하려는 타입 뒤에?을 붙인다.
val x: String? = y as String?
y as String뒤에
?를 붙여줌으로써 y가 null인 경우에도예외가 호출되지 않는다.
val x: String? = y as? String
오른쪽의 y as? String :
y가 String이 아닐 경우예외를 호출하지 않고 null값을 반환하기 위해as?로 안전하게 캐스팅한다.
왼쪽의 val x: String? = :
x 변수가 String이라고 선언함과 동시에 오른쪽의 식에서 값을 받아오려고 하는데, String이 아닌 null값이 들어오게 되면예외가 호출되기 때문에String?으로 안전하게 캐스팅한다.