[Kotlin] 타입 캐스팅

최율·2022년 12월 9일
0

Kotlin

목록 보기
7/10

타입 캐스팅

다음 코드에는 오류가 있다. 어디에 있을까?

val objects = arrayOf("1", 2, "3", 4) // obejcts 는 Any의 배열

fun main() {
    for (obj in objects) {
        println(obj * 2)
    }
}

바로 Any 타입은 * 연산을 지원하지 않는다는 점에서 오류가 발생한다.

그렇다면 Any의 배열에서 현재 obj가 만약 정수라면 sum을 더하고, 문자열이라면 출력해주는 코드로 수정해보자.

is 연산자

타입 검사는 코틀린의 연산자인 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 연산자는 인스턴스의 타입이 원하는 타입일 때 해당 타입으로 변환시켜준다.
만약 변환이 불가능하다면 예외를 반환하고, 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)
    }
}
profile
공부한 것을 기록하고 공유하는 학생입니다!

0개의 댓글