타입 캐스팅 (`as`, `is` 연산자) - swkim0128/PARA GitHub Wiki
코틀린에서 **타입 캐스팅(Type Casting)**은 객체의 타입을 변환할 때 사용됩니다. 코틀린은 타입 안전성을 보장하기 위해 안전한 타입 변환을 위한 연산자를 제공합니다.
- is 연산자는 객체가 특정 타입인지 확인할 때 사용됩니다.
- 타입이 일치하면 true, 그렇지 않으면 false를 반환합니다.
fun main() {
val value: Any = "Hello, Kotlin!"
if (value is String) {
println(value.length) // 출력: 14
}
}
- value가 String 타입인지 검사한 후, length 프로퍼티를 안전하게 사용.
fun main() {
val num: Any = 42
if (num !is String) {
println("num은 String이 아닙니다.") // 출력됨
}
}
- !is를 사용하면 특정 타입이 아닐 때 조건을 실행할 수 있음.
- as 연산자는 객체를 특정 타입으로 변환할 때 사용됩니다.
- 실패하면 ClassCastException이 발생하므로 사용 시 주의가 필요합니다.
fun main() {
val value: Any = "Kotlin"
val text: String = value as String // 명시적 캐스팅
println(text) // 출력: Kotlin
}
- value를 String으로 변환 후 출력.
fun main() {
val number: Any = 100
val text: String = number as String // 런타임 오류 발생 (ClassCastException)
println(text)
}
🚫 타입이 맞지 않으면 ClassCastException이 발생하므로 주의해야 합니다.
- 캐스팅 실패 시 null을 반환하는 안전한 캐스팅 연산자입니다.
- as 연산자와 달리 예외가 발생하지 않음.
fun main() {
val number: Any = 100
val text: String? = number as? String // 안전한 캐스팅 (null 반환)
println(text) // 출력: null
}
🚀 as?를 사용하면 잘못된 캐스팅 시 예외 없이 null을 반환하므로 더욱 안전함.
- is 연산자로 타입을 검사하면 자동으로 스마트 캐스트가 적용됩니다.
- 명시적 캐스팅 없이 해당 타입의 메서드나 프로퍼티를 사용할 수 있음.
fun printLength(value: Any) {
if (value is String) {
println(value.length) // 자동으로 String으로 캐스팅됨
}
}
fun main() {
printLength("Hello, Kotlin!") // 출력: 14
}
- is 연산자로 타입 검사를 하면 자동으로 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 | 객체가 특정 타입인지 확인 | if (obj is String) { ... } | ❌ |
!is | 특정 타입이 아닐 경우 실행 | if (obj !is Int) { ... } | ❌ |
as | 명시적 타입 변환 | val text: String = obj as String | ✅ (타입 불일치 시) |
as? | 안전한 타입 변환 (null 반환) | val text: String? = obj as? String | ❌ |
✅ is 연산자로 안전하게 타입 확인 가능 (스마트 캐스트 적용됨) ✅ as 연산자는 ClassCastException 발생 가능, 주의해야 함 ✅ as? 연산자는 실패 시 null 반환하므로 안전한 캐스팅이 필요할 때 사용 ✅ when과 is를 함께 사용하면 다양한 타입을 깔끔하게 처리 가능
💡 as 대신 as?를 적극 활용하여 안전한 캐스팅을 수행하는 것이 권장됩니다! 🚀