Effective Kotlin - 스마트 캐스팅이란?

JINHO LEE·2024년 6월 24일
0

아이템 5: 예외를 활용해 코드에 제한을 걸어라 관련 내용에서 나온 용어 정리입니다.

스마트 캐스팅

스마트 캐스팅은 코틀린의 강력한 기능 중 하나로, 컴파일러가 특정 조건을 만족하면 자동으로 타입을 캐스팅해주는 기능이다.
이로 인해 타입 검사와 캐스팅을 수동으로 할 필요가 줄어들어 코드가 더 간결하고 안전해진다.

스마트 캐스팅의 원리

스마트 캐스팅은 다음과 같은 조건을 만족할 때 작동한다.

  • 타입이 명확히 검사된 경우.
  • 변경되지 않는 변수 (val)나 로컬 변수에 대해 적용.

컴파일러가 스마트 캐스팅을 적용하면, 명시적인 캐스팅 없이도 변수를 안전하게 다른 타입으로 사용할 수 있다.

예시

if 조건문과 스마트 캐스팅
가장 일반적인 예는 if 조건문을 통해 타입을 검사한 후 그 타입으로 안전하게 사용하는 경우

kotlin

fun printLength(obj: Any) {
    if (obj is String) {
        // obj는 자동으로 String 타입으로 스마트 캐스팅됨
        println(obj.length)
    } else {
        println("obj is not a String")
    }
}

when 조건문과 스마트 캐스팅
when 조건문에서도 동일하게 스마트 캐스팅이 적용된다.

fun handleObject(obj: Any) {
    when (obj) {
        is String -> println("String with length ${obj.length}")
        is Int -> println("Integer value is $obj")
        else -> println("Unknown type")
    }
}

val과 스마트 캐스팅
변경되지 않는 변수 (val)에 대해서도 스마트 캐스팅이 가능하다.

fun processInput(input: Any) {
    val value = input
    if (value is Int) {
        println("Integer: ${value * 2}")
    }
}

var와 스마트 캐스팅
변경 가능한 변수 (var)는 스마트 캐스팅이 제한적이다.
컴파일러는 변수가 변경될 가능성이 있는 경우 스마트 캐스팅을 적용하지 않는다.

fun demoVarCasting(input: Any) {
    var value = input
    if (value is String) {
        // value를 다른 값으로 변경할 수 있기 때문에 스마트 캐스팅되지 않음
        println(value.length) // 컴파일 오류 발생
    }
}

그러나 value 변수가 특정 블록 내에서 변경되지 않는다는 것을 확실히 할 수 있다면, 스마트 캐스팅이 적용될 수 있다.

스마트 캐스팅의 한계

스마트 캐스팅은 다음과 같은 경우에 제한된다:

  • 변수가 변경될 가능성이 있는 경우 (예: var).
  • 스마트 캐스팅이 적용될 범위 밖에서 변수를 사용하려는 경우.
  • 스마트 캐스팅이 불가능한 복잡한 조건문 내에서 사용하려는 경우.

요약

스마트 캐스팅은 코틀린의 타입 검사와 캐스팅을 간결하고 안전하게 만드는 기능이다.
스마트 캐스팅을 통해 코드의 가독성과 안전성을 높일 수 있고,
if나 when 조건문에서 타입을 검사한 후 명시적인 캐스팅 없이도 그 타입으로 안전하게 사용할 수 있도록 해둔다. val 변수에 대해서는 더욱 강력하게 적용되며, var 변수에 대해서는 제한적으로 적용된다.

0개의 댓글