본문 바로가기

Study/Kotlin Study

[Kotlin] 타입 검사와 캐스팅

+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.

컴파일 시간의 타입 검사

컴파일 시, 변수의 타입에 맞추어 연산 검사를 수행한다.

fun main() {
    val objects = arrayOf("1", 2, "3", 4) // Any의 배열이 된다.

    for(obj in objects) { // obj의 타입: Any
        println(obj * 2) // any 타입에는 곱하기 연산을 할 수 없으므로 에러 발생
    }
}

is 연산자

is 연산자: is의 왼쪽 타입이 is의 오른쪽에 해당하면 true 반환한다.

fun main() {
    val objects = arrayOf("1", 2, "3", 4)
    var sum = 0

    for(obj in objects) {
        if (obj is Int) { // obj의 타입을 Int로 스마트 캐스트
            sum += obj
        }
    }
    println(sum) // 6
}

 

null모든 null이 될 수 있는 타입으로 파악한다.

 

!is 연산자는 is의 반대 결과로 연산한다.

 

=> is 연산자를 통하여 인스턴스의 타입이 검사되면 해당 타입으로 자동 스마트 캐스트가 된다. 


when과 is를 통한 스마트 캐스트

when과 is를 통하면 인스턴스 타입별 연산 수행이 가능해진다.

fun main() {
    val objects = arrayOf("1", 2, "3", 4)
    var sum = 0

    for(obj in objects) {
        when (obj) { // obj의 타입을 Int로 스마트 캐스트
            is Int -> sum += obj
            is String -> sum += obj.toInt()
        }
    }
    println(sum) // 10
}

as를 이용한 변수의 타입 변환

as는 인스턴스의 타입이 원하는 타입일 때 해당 타입으로 변화하여 연산할 수 있게 해준다.

fun main() {
    val o: Any = 123 // Any 타입이지만 실제로는 Int 타입의 값을 갖고 있다.

    println((o as Long)) // Any형 o을 실제 데이터 타입이 아닌 Long형으로 변환 -> 예외 발생
}

 

as는 변환이 불가능할 시 예외가 발생하고, as?null을 반환하다.

- Any처럼 상위 클래스 -> 하위 클래스로만 변환이 가능하다.

fun main() {
    val o: Any = 123

    println((o as? Long)) // Any형 o을 실제 데이터 타입이 아닌 Long형으로 변환 -> null 반환
}

 

엘비스 연산자로 null을 처리할 수 있다.

fun main() {
    val o: Any = 123

    println((o as? Long) ?: 0) // 엘비스 연산자로 null 처리
}

프로퍼티와 스마트 캐스트

프로퍼티는 스마트 캐스트가 안되므로 as?와 let을 이용해야한다.

class Holder {
    var o: Any = ""
}

fun main() {
    val holder = Holder()

    if (holder.o is String) {
        println(holder.o.length) // 객체의 프로퍼티는 스마트 캐스트가 적용 안됨 -> 에러 발생
    }
}

 

시험 출제!!!!

class Holder {
    var o: Any = 0
}

fun main() {
    val holder = Holder()

    // holder.o이 String의 상위 클래스 타입이어서 String으로 변환할 수 있으면 변환, 없으면 null이다. null이 아닐 경우 let을 실행한다.
    (holder.o as? String)?.let {
        println(it.length)
    }
}

'Study > Kotlin Study' 카테고리의 다른 글

[Kotlin] 추상 클래스와 추상 멤버  (0) 2023.11.02
[Kotlin] 공통 메소드  (1) 2023.10.23
[Kotlin] 하위 클래스 초기화  (0) 2023.10.23
[Kotlin] 하위 클래스 선언  (2) 2023.10.23
[Kotlin] Fragment 실습  (2) 2023.10.14