다음 코드에는 오류가 있다. 어디에 있을까?
val objects = arrayOf("1", 2, "3", 4) // obejcts 는 Any의 배열
fun main() {
for (obj in objects) {
println(obj * 2)
}
}
바로 Any 타입은 * 연산을 지원하지 않는다는 점에서 오류가 발생한다.
그렇다면 Any의 배열에서 현재 obj가 만약 정수라면 sum을 더하고, 문자열이라면 출력해주는 코드로 수정해보자.
타입 검사는 코틀린의 연산자인 is로 가능하다.
val objects = arrayOf("1", 2, "3", 4)
var sum = 0
fun main() {
for (obj in objects) {
when (obj) {
is Int -> sum += obj
is String -> println("obj: $obj")
}
}
println("sum: $sum")
}
as 연산자는 인스턴스의 타입이 원하는 타입일 때 해당 타입으로 변환시켜준다.
만약 변환이 불가능하다면 예외를 반환하고, as? 연산자는 null을 반환한다.
fun main() {
val obj: Any = 123
println((obj as Int) + 2) // 125
println((obj as? Int)!! + 3) // 125
println((obj as? String ?: "").length) // 0
println((obj as String).length) // runtime error
}
클래스의 프로퍼티는 스마트 캐스트가 되지 않으므로 as? 와 let을 이용해야한다.
class Holder {
val o: Any get() = "Hello"
}
fun main() {
val holder = Holder()
/*
if (holder.o is String) {
println(holder.o.length) // error
}
*/
(holder.o as? String)?.let {
println(it.length)
}
}