[Kotlin] null safety

PUJIN·2023년 6월 4일
0
post-thumbnail

null safe


null 값에 대한 안전성 확보

참조 변수에 객체의 ID가 저장되어 있으면 해당 객체에 접근 가능하지만 null이 저장되어 있으면 객체의 ID가 존재하지 않아 객체에 접근 불가능

  • null이 저장된 객체에 접근하는 코드는 NullPointerException 발생

    • NullPointerException :
      객체의 주소 값이 담겨있지 않는 (null 값) 참조변수에 접근하려는 경우 발생



null 허용 변수


var/val 변수명 : 자료형? = 값

  • null을 허용하는 변수

var/val 변수명 : 자료형 = 값

  • null을 허용하지 않는 변수
  • 반드시 변수에 객체의 ID 저장



연산자


  • !! 연산자
    • null을 허용하는 변수에 담긴 값을 null을 허용하지 않는 타입으로 변환
    • 변환 과정에서 null이 들어있는 변수의 경우 : 오류 발생
      null 안전성 확보 X
fun testFun(str1:String?){

    val value1:String = str1!!
    println("$value1")  // testFun(null) : 에러
}
  • ?: 연산자
    • null이 아닌 값이 저장되어 있는 경우 : 저장된 객체의 ID 값 반환
    • null이 저장되어 있는 경우 : 지정된 기본값 반환
fun testFun(str1:String?){

    val value1:String = str1 ?: "기본문자열"
    println("$value1")  // testFun(null) : 기본문자열
}
  • ?. 연산자
    • 참조 변수를 통해 메서드를 호출하거나 멤버 변수를 사용할 경우 객체 ID가 저장되어 있다면 객체에 접근하여 사용
    • 참조 변수에 null이 저장되어 있는 경우 : null 값 반환오류 X
      • 참조변수?.멤버 변수 : 참조변수 값이 null인 경우 null 반환
      • 참조변수?.멤버 메서드 : 참조변수 값이 null인 경우 메서드 호출 X
fun testFun(t1:TestClass1?){

    println("t1.str1 : ${t1?.str1}")  //testFun(null) : null
    println("t1.str2 : ${t1?.str2}")  //testFun(null) : null
    t1?.testMethod1()  //testFun(null) : 실행 X
}



스마트 캐스팅


null을 허용하는 변수가 null 안전성을 보장(if문 사용)하는 경우 null을 허용하지 않는 타입으로 변환

  • if문 사용
    • null 허용 변수에 null 값이 아닌 객체 주소 값이 저장되어 있음을 if문으로 검사
      null 안전성 확보
    • if문 내부 : null을 허용하지 않는 변수처럼 이용 가능
      • 다른 연산자를 사용하지 않고 멤버 접근 가능
    • if문 이후 : 다시 null 허용 변수로 작동
fun testFun(str1:String?){

    if(str1 != null){   //testFun(null) : 실행 X, 에러 X
        val value1:String = str1
        println("$value1")
    }
}
  • is 연산자
    • 타입 검사 + 타입 캐스팅 동시 처리
    • if문 내 비교 연산자로 검사할 때 타입이 Any인 경우 컴파일 오류 발생
fun testFun(str:String?) {
  if(str is String){  //testFun(null) : 실행 X
      println(str.length)
  }
}

0개의 댓글