본문 바로가기
안드로이드/Kotlin

[Kotlin] 타입 연산자(is, as), 널 처리 연산자

by jinwo_o 2024. 12. 8.

타입

  • 여러 종류의 데이터를 식별하는 분류로, 어떤 값이 가능한지와 그 타입에 대해 수행할 수 있는 연산의 종류를 결정한다.

 

타입 체크

  • is와 !is 연산자를 사용하여 런타임에 객체가 주어진 타입인지 확인할 수 있다.
  • 스마트 캐스트(Smart Cast) : 컴파일러가 불변 값에 대해 is 검사를 추적하여 필요할 때 자동으로 (안전하게) 캐스팅을 수행하는 기능

 

타입 캐스팅

  • as 연산자를 사용하여 데이터 타입을 다른 데이터 타입으로 변환할 수 있다.
  • 캐스팅은 주로 상속 관계에 있는 클래스들 간에 사용된다.
  • 상위 클래스의 객체를 하위 클래스 타입으로 변환하거나, 하위 클래스의 객체를 상위 클래스 타입으로 변환하는 데 활용된다.

 

업캐스팅

  • 하위 클래스의 인스턴스를 상위 클래스 타입으로 변환하는 것
  • 항상 안전하며, 명시적으로 캐스팅하지 않아도 자동으로 이루어진다.
  • 상위 클래스의 멤버만 사용할 수 있다.
  • 하위 클래스 고유의 멤버는 숨겨지며 사용할 수 없다.
open class Parent {
    val name: String = "parent"
}

class Child : Parent() {
    val childAge: Int = 30
}

fun main() {
    val child = Child()
    val parent: Parent = child // 업캐스팅 (자동 변환)

    println(parent.name) // "parent"
    // println(parent.childAge) // 컴파일 에러: Parent 타입에는 childAge가 없음
}

 

다운캐스팅

  • 상위 클래스의 인스턴스를 하위 클래스 타입으로 변환하는 것
  • 런타임에 객체의 실제 타입을 검사한다.
    • 객체가 실제로 하위 클래스 타입일 경우에만 성공한다.
    • 잘못된 캐스팅 시 ClassCastException 이 발생한다.
  • 명시적으로 캐스팅해야 한다.
fun main() {
    val child = Child()
    val parent: Parent = child // 업캐스팅

    // Parent 타입으로 선언되었지만, 실제로는 Child 객체
    val newChild = parent as Child // 다운캐스팅 (명시적)
    println(newChild.childAge) // 30
    
    val parent = Parent() // Parent 객체
    val newChild = parent as Child // ClassCastException 발생
}

널 가능성(Nullability)

  • 변수나 객체가 유효한 값을 가지지 않고 null 일 가능성
  • NullPointerException 오류(NPE)를 피할 수 있게 돕기 위한 코틀린 타입 시스템의 특성
  • null 에 대한 접근 방법은 가능한 한 이 문제를 실행 시점에서 컴파일 시점으로 옮기는 것이다.
    • 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 컴파일 시 미리 감지해서 실행 시점에 발생할 수 있는 예외의 가능성을 줄일 수 있다.
  • 코틀린 타입 시스템은 타입 이름 뒤에 물음표(?)를 명시하여 널이 될 수 있는 타입(Nullable Type)을 정의할 수 있도록 지원한다.

 

널 처리 연산자

안전한 호출 연산자(Safe call Operator) : ?.

  • 호출하려는 값이 null 이 아니면 일반 메소드 호출처럼 동작하는 것
  • 호출하려는 값이 null 이면 이 호출은 무시되고 null 이 반환된다.

 

엘비스 연산자(Elvis Operator) : ?:

  • null 대신 사용할 디폴트 값을 지정할 때 사용한다.

 

안전한 캐스트(Safe casts) : as?

  • 어떤 값을 지정한 타입으로 캐스트한다.
  • 값을 대상 타입으로 변환할 수 없으면 null을 반환한다.

 

Non-null 단언 연산자(Non-null assertioin) : !!

  • 어떤 값이든 널이 될 수 없는 타입으로 변환하다.
  • 실제로 null 인 값에 적용하면 NPE(NullPointerException) 가 발생한다.

 

Kotlin In Action 6장

널이 될 수 있는 타입과 널을 처리하는 구문의 문법. 코틀린 원시 타입 소개와 자바 타입과 코틀린 원시 타입의 관계. 코틀린 컬렉션 소개와 자바 컬렉션과 코틀린 컬렉션의 관계. 코틀린의 타입

velog.io

 

타입 체크와 캐스팅 · Kotlin 개인 정리

 

pluu.gitbooks.io

 

[Kotlin] 코틀린 타입 시스템

자바와 비슷해보이면서도 많이 다른 코틀린의 타입 시스템에 대해 알아보자.

jaeyeong951.medium.com

 

[Swift] 업캐스팅과 다운캐스팅, Swift와 Kotlin 옵셔널의 차이

이번 시간에는 업캐스팅과 다운캐스팅에 대해서 간단히 알아보고 Swift에서 사용되는 옵셔널이 코틀린에서 사용되는데 두 차이점에 대해서 간단히 표로 정리해보려고 합니다! 업캐스팅(Upcasting)

zeromin-code.tistory.com