스마트 캐스트 - swkim0128/PARA GitHub Wiki

**스마트 캐스트(Smart Cast)**는 is 연산자를 사용하여 타입을 검사하면 자동으로 해당 타입으로 캐스팅해주는 기능입니다. 즉, 명시적인 캐스팅(as) 없이도 변수의 타입을 안전하게 사용할 수 있도록 지원합니다.

1. 스마트 캐스트란?

  • is 연산자로 특정 타입인지 확인하면 자동으로 타입이 변환됨.
  • 명시적인 as 캐스팅 없이 해당 타입의 프로퍼티나 메서드를 사용할 수 있음.
  • 주로 if 문과 when 표현식에서 사용됨.

2. 스마트 캐스트 예제

(1) is 연산자를 활용한 스마트 캐스트

fun printLength(value: Any) {
    if (value is String) {
        // 스마트 캐스트 적용됨 → 명시적 캐스팅 없이 length 사용 가능
        println("문자열 길이: ${value.length}")
    } else {
        println("문자열이 아닙니다.")
    }
}

fun main() {
    printLength("Hello, Kotlin!") // 출력: 문자열 길이: 14
    printLength(42) // 출력: 문자열이 아닙니다.
}

설명:

  • if (value is String) 검사 후 value가 자동으로 String으로 변환됨.
  • 명시적 캐스팅(as String) 없이 length 속성을 사용할 수 있음.

(2) when 표현식과 스마트 캐스트

fun describe(value: Any): String {
    return when (value) {
        is String -> "문자열: ${value.length} 글자"
        is Int -> "정수: $value"
        is Double -> "실수: $value"
        else -> "알 수 없는 타입"
    }
}

fun main() {
    println(describe("Kotlin")) // 출력: 문자열: 6 글자
    println(describe(42)) // 출력: 정수: 42
    println(describe(3.14)) // 출력: 실수: 3.14
}

설명:

  • when 블록에서 각 타입을 검사한 후 자동으로 해당 타입으로 변환됨.
  • is String 조건을 통과하면 value가 자동으로 String으로 스마트 캐스트됨.

3. 스마트 캐스트의 조건

🚀 스마트 캐스트가 적용되려면 아래 조건을 만족해야 합니다.

✅ 1) val 변수여야 함

  • var 변수는 값이 변경될 수 있으므로 스마트 캐스트가 적용되지 않음.
fun checkType(value: Any) {
    if (value is String) {
        println(value.length) // ✅ 스마트 캐스트 적용됨
    }
}

fun main() {
    val text: Any = "Hello"
    checkType(text)
}

🚫 var 변수에는 스마트 캐스트 적용 불가

fun checkType(varText: Any) {
    if (varText is String) {
        // varText는 스마트 캐스트되지 않음 ❌ (컴파일 오류 발생)
        println(varText.length)
    }
}

해결 방법: val 변수 또는 let 블록을 사용하면 스마트 캐스트를 적용할 수 있음.

✅ 2) var 변수의 경우 별도의 블록에서 사용해야 함

fun checkType(value: Any) {
    if (value is String) {
        val text: String = value // ✅ 스마트 캐스트 적용
        println(text.length)
    }
}

✅ 3) 커스텀 게터가 없는 프로퍼티에서만 가능

class Example(val name: Any) {
    fun check() {
        if (name is String) {
            println(name.length) // ✅ 스마트 캐스트 적용 가능
        }
    }
}

🚫 커스텀 게터가 있는 경우 스마트 캐스트가 적용되지 않음

class ExampleWithGetter(private val _name: Any) {
    val name: Any
        get() = _name // 스마트 캐스트 적용되지 않음

    fun check() {
        if (name is String) {
            // ❌ 스마트 캐스트 적용되지 않음 (컴파일 오류)
            println(name.length)
        }
    }
}

해결 방법: val 대신 지역 변수를 사용하거나 let을 활용.

4. let과 스마트 캐스트

  • let 블록을 사용하면 var 변수에도 스마트 캐스트를 적용할 수 있음.
fun checkType(value: Any) {
    value.let {
        if (it is String) {
            println(it.length) // ✅ 스마트 캐스트 적용 가능
        }
    }
}

설명:

  • let 내부에서 it이 스마트 캐스트됨.

5. 스마트 캐스트가 적용되지 않는 경우

🚫 스마트 캐스트가 적용되지 않는 주요 사례

경우 해결 방법
var 변수 val 변수로 변경 또는 let 사용
커스텀 게터가 있는 프로퍼티 별도 로컬 변수에 저장 후 사용
멀티 스레드 환경 로컬 변수를 사용하여 스마트 캐스트 적용

6. 스마트 캐스트 요약

연산자 설명 예제
is 특정 타입인지 확인 if (value is String) { ... }
!is 특정 타입이 아닐 경우 실행 if (value !is Int) { ... }
when 여러 타입을 체크하여 스마트 캐스트 적용 when (value) { is String -> ... }
let var 변수에서도 스마트 캐스트 적용 가능 value.let { if (it is String) { ... } }

7. 결론

is 연산자로 타입 검사를 하면 스마트 캐스트가 적용됨.when과 함께 사용하면 다양한 타입을 쉽게 처리할 수 있음.var 변수는 스마트 캐스트가 적용되지 않으므로 val을 사용하거나 let 블록을 활용해야 함.커스텀 게터가 있는 경우 스마트 캐스트가 적용되지 않음.

💡 스마트 캐스트를 활용하면 as 연산자 없이도 안전한 타입 변환이 가능하여 코드의 가독성과 안정성이 향상됩니다! 🚀

⚠️ **GitHub.com Fallback** ⚠️