스마트 캐스트 - swkim0128/PARA GitHub Wiki
**스마트 캐스트(Smart Cast)**는 is 연산자를 사용하여 타입을 검사하면 자동으로 해당 타입으로 캐스팅해주는 기능입니다. 즉, 명시적인 캐스팅(as) 없이도 변수의 타입을 안전하게 사용할 수 있도록 지원합니다.
- is 연산자로 특정 타입인지 확인하면 자동으로 타입이 변환됨.
- 명시적인 as 캐스팅 없이 해당 타입의 프로퍼티나 메서드를 사용할 수 있음.
- 주로 if 문과 when 표현식에서 사용됨.
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 속성을 사용할 수 있음.
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으로 스마트 캐스트됨.
🚀 스마트 캐스트가 적용되려면 아래 조건을 만족해야 합니다.
✅ 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을 활용.
- let 블록을 사용하면 var 변수에도 스마트 캐스트를 적용할 수 있음.
fun checkType(value: Any) {
value.let {
if (it is String) {
println(it.length) // ✅ 스마트 캐스트 적용 가능
}
}
}
설명:
- let 내부에서 it이 스마트 캐스트됨.
🚫 스마트 캐스트가 적용되지 않는 주요 사례
경우 | 해결 방법 |
---|---|
var 변수 | val 변수로 변경 또는 let 사용 |
커스텀 게터가 있는 프로퍼티 | 별도 로컬 변수에 저장 후 사용 |
멀티 스레드 환경 | 로컬 변수를 사용하여 스마트 캐스트 적용 |
연산자 | 설명 | 예제 |
---|---|---|
is | 특정 타입인지 확인 | if (value is String) { ... } |
!is | 특정 타입이 아닐 경우 실행 | if (value !is Int) { ... } |
when | 여러 타입을 체크하여 스마트 캐스트 적용 | when (value) { is String -> ... } |
let | var 변수에서도 스마트 캐스트 적용 가능 | value.let { if (it is String) { ... } } |
✅ is 연산자로 타입 검사를 하면 스마트 캐스트가 적용됨. ✅ when과 함께 사용하면 다양한 타입을 쉽게 처리할 수 있음. ✅ var 변수는 스마트 캐스트가 적용되지 않으므로 val을 사용하거나 let 블록을 활용해야 함. ✅ 커스텀 게터가 있는 경우 스마트 캐스트가 적용되지 않음.
💡 스마트 캐스트를 활용하면 as 연산자 없이도 안전한 타입 변환이 가능하여 코드의 가독성과 안정성이 향상됩니다! 🚀