안드로이드 앱(Kotlin|Java)/[2025~] 안드로이드 앱

Part0_Ch01_09 타입체크와 캐스팅

heylo 2025. 1. 24. 17:46

 

1) 타입체킹 (is)

타입 체크 : 오브젝트나 인스턴스의 type을 확인하는 것 형식 : <object> is <type>

// 타입 체크: 오브젝트나 인스턴스의 타입을 확인하는 것
fun main() {
    // object is type
    println(check("안녕"))
    println(check(3))
    println(check(true))

}

fun check( a: Any ) : String{
    return when (a) {
        is String -> {
            "문자열"
        }

        is Int -> {
            "숫자"
        }

        else -> {
            "몰라요"
        }
    }
}

 

2) 캐스팅 ( as )

fun main() {
    cast("안녕")
    cast(10) // class cast exception 발생
}

// 캐스팅
fun cast(a : Any) {
    val result = a as String // a 를 String 으로 받겠다
    println(result)
}

 

2-1) Class Cast Exception 처리 (1)

Class Cast Exception 을 잡아주려면?

val result = a as String 

위 코드 한 줄을, 아래와 같이 변경

엘비스 연산자 (?) 를 사용함으로써 a 를 String 으로 받을 수 없을 때, a 값을 자동으로 null 로 만들어준다.

val result = a as? String
fun main() {
    cast("안녕")
    cast(10)
}

// 캐스팅
fun cast(a : Any) {
    val result = a as? String
    println(result)
}

 

as 를 통해서 checking 을 하여 String으로 변환이 되어서 나오거나 null 값을 반환

 

 

2-2) Class Cast Exception 처리 (2)

fun main() {
    cast("안녕")
    cast(10)
}

// 캐스팅
fun cast(a : Any) {
    val result = (a as? String) ?: "캐스팅 실패"
    println(result)
}

 

 

3) 스마트 캐스팅

a 가 String 임을 이미 체킹했으면

String 관련 함수 캐스팅 없이 바로 사용 가능

fun main() {
    smartcast("안녕")
    smartcast(10)
    smartcast(true)
}

// 스마트 캐스트
fun smartcast(a: Any) {
    var result = if (a is String){ // 이미 a 가 String인지 체킹했으므로
        a.length // 캐스팅 없이, length 값을 사용 가능
        
    } else if ( a is Int){
        a.dec() // 1 감소
        
    }else {
        -1
    }
    
    println(result)
}