타입 체크, 캐스팅

김건우·2023년 12월 5일

개발 공부

목록 보기
2/13
post-thumbnail

참고 : Kotlin Docs
https://kotlinlang.org/docs/typecasts.html

타입 체크 Type check

코드 실행 중에 객체의 타입을 확인할 수 있다.

is!is 연산자

  • is로 객체의 타입 확인하기
if (obj is String) {
    print(obj.length)
}

obj 객체가 String 타입인지 확인한다. String이면 true, 아니면 false 를 return한다.

  • !is로 객체의 타입 확인하기
if (obj !is String) { // Same as !(obj is String)
    print("Not a String")
} else {
    print(obj.length)
}

obj 객체가 String 타입이 아닌지 확인. String이면 false, 아니면 true 를 return한다.

스마트 캐스트 Smart Casts

  • 코틀린에서는 대부분 명시적 캐스팅 연산자를 사용하지 않아도 된다.
fun demo(x: Any) {
    if (x is String) {
        print(x.length) 
    }
}

컴파일러가 두 번째 줄 if (x is String)에서 x 가 String 타입인지 체크했기 때문에 print문의 x가 String타입으로 자동적으로 캐스팅된다.

  • || OR&& AND 식에서도 사용 가능하다.
if (x !is String || x.length == 0) return

if 문의 || 왼쪽 식에서 x !is String으로 x의 타입을 검사했기 때문에 오른쪽 식의 x는 자동적으로 String으로 캐스팅된다.

if (x is String && x.length > 0) {
    print(x.length) // x is automatically cast to String
}

if 문의 && 왼쪽 식에서 x is String으로 x의 타입을 검사했기 때문에 오른쪽 식의 x는 자동적으로 String으로 캐스팅된다.

  • when expression과 while loop에서도 스마트캐스트가 동작한다.
when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

왼쪽의 is Int에서 x의 타입을 검사했기 때문에 오른쪽의 식에서 명시적 타입 캐스팅이 필요하지 않다.
아래의 is String과 is IntArray줄도 마찬가지이다.

안전한/불안전한 캐스팅 연산자

  • 타입 캐스팅이 불가능할 경우 캐스팅 연산자예외를 호출한다.
  • 불안전한 캐스팅 연산자 : as 키워드 사용
val x: String = y as String

위 식에서 y가 null이라면, null은 String으로 캐스팅될 수 없기 때문에 이 식은 예외을 호출한다.
null 값을 처리하려면, 검사하려는 타입 뒤에 ?을 붙인다.

val x: String? = y as String?

y as String뒤에 ?를 붙여줌으로써 y가 null인 경우에도 예외가 호출되지 않는다.

  • 안전한 캐스팅 연산
val x: String? = y as? String

오른쪽의 y as? String :
y가 String이 아닐 경우 예외를 호출하지 않고 null값을 반환하기 위해 as?로 안전하게 캐스팅한다.

왼쪽의 val x: String? = :
x 변수가 String이라고 선언함과 동시에 오른쪽의 식에서 값을 받아오려고 하는데, String이 아닌 null값이 들어오게 되면 예외가 호출되기 때문에 String? 으로 안전하게 캐스팅한다.

profile
즐겁게

0개의 댓글