코틀린_NullSafe

소정·2023년 3월 22일
0

Kotlin

목록 보기
6/27
  • 코틀린 언어의 주요 특징 중 하나

  • Null Pointer Exception[NPE] 에 대한 안정성을 보유한 언어

  • 코틀린은 기본적으로 null값을 저장할 수 없다

  • 따라서 null값을 저장할 수 있는 타입을 명식적으로 구분하여 사용하도록 하고 있다

  • 변수에 null을 대입하고 싶다면 ? 키워드를 붙여 nullable한 변수임을 명시한다

    	ex) var s2:String? = null

🔨 nullable 변수들을 사용할 때 특이한 멤버접근 연산자

  1. ?.
    • 넘어온 값이 null이면 실행 x null이 아니면 실행ㄴ
  2. ?: -> 엘비스 연산자
    • 객체가 null 일때 null 대신 default값 지정하기
  3. !! -> non-null asserted call 연산자
    • 많은 매개변수들이 nullable로 되 어있음 그럴 때 쓴다
    • null이 아님을 확실할 때 사용하는 연산자
  4. as? -> 안전한 캐스팅(형변환) 연산자
    • 자료형이 맞지 않는 타입



nullable 변수 접근 연산자 사용법

package com.bsj0420.ex01kotlinhello

fun main() {

    //코틀린 언어의 주요 특징 중 하나
    //Null Pointer Exception[NPE] 에 대한 안정성을 보유한 언어

    //코틀린은 null값을 저장할 수 없다
    //그래서 null값을 저장할 수 있는 타입을 명식적으로 구분하여
    //사용하도록 하고 있다

    //var s1:String = null // 에러 : non-nullable 변수

    var s2:String? = null //nullable 변수

    println(s2)

    // nullable 변수들을 사용할 때 특이한 멤버접근 연산자들
    // . 연산자가 아닌...

    var str1:String = "Hello" // non-nullable variable
    var str2:String? = "Nice" // nullable variable
    var str3:String? = null // nullable variable

    //멤버 사용법의 차이
    println("글자수 : ${str1.length}")
    //println("글자수 : ${str2.length}") //error . 에 에러 - null일수도 있어서 막 사용하지 말라고 에러로 표시

    //해결방법 : null이 아닐때만 하도록 if문
    if (str2!=null) {
        //이 영역은 null이 아님이 확실
        println("글자수 : ${str2.length}") //에러 메세지 안뜬다
    }
    
    //위 if문 처리는 해결은 되지만 번거로움 
    //그래서 등장한 null안정성 접든 연산자들
    //1) ?.  연산자
    println("?. 글자수 str2 : ${str2?.length}")// 만약 null이 아니면 length 구동
    println("?. 글자수 str3 : ${str3?.length}")// null이면 null이라고 나옴

    //2) 
    //객체가 null 일때 null 대신 default값 지정하기
    //객체가 null이면 길이값 -1 나오도록 해보기

    val len:Int = if(str3 != null) str3.length else -1
    println(len)

    //if else 문이 번거롭다면 
    // ?: 연산자 - 엘비스 연산자
    val len2:Int = str3?.length ?: -1
    println(len2)
    
    //3) non-null asserted call 연산자 : !!
    //이런식으로 NPE에 안전한 연산자 기능이 있지만 
    //이 기능을 사용하지 않고 그냥 null이면 예외처리
    //다시 말해, null이 아님을 확실할 때 사용하는 연산자

    var ss:String?="Hello"
    println("글자수 : ${ss!!.length}")

    var sss:String?= null
    //println("글자수 : ${sss!!.length}") // NullPointerException 발생

    println()

    // !! 쓰는 예 - 논 널어블 변수에 널어블 변수를 넣을 때 사용
    var mmm:String? = "Nice"
    //var nnn:String = mmm // !! 안쓰면 error
    var nnn:String = mmm!!; // 값 전달 할 때

    var ttt:String = "Good"
    var xxx:String? = ttt // 그냥 ok


    //4) 안전한 캐스팅(형변환) 연산자 as? - 자료형이 맞지 않는 타입

    val yyy:YYY?= YYY()

    //val zzz:ZZZ?= yyy

    //val zzz:ZZZ ?= yyy as ZZZ // ClassCastException - 억지로 형변환 하면 에러 표시는 없지만 Exception 발생
    
    //안전하게 형변환을 수행하는 연산자
    val zzz:ZZZ? = yyy as? ZZZ // 형변환이 불가하면 에러가 아니라 null값을 전달
    println(zzz) // -> null

}

class YYY {
    var a = 10
}
class ZZZ {
    var a = 20
}

profile
보조기억장치

0개의 댓글