개발(Android)/kotlin syntax

[Kotlin syntax] Null Safety

shinyelee 2022. 4. 7. 19:49

[코틀린 문법] null 처리

Nullability(널 가능성)

// Nullability(널 가능성) //

// null pointer exception 방지위해 if문으로 매번 조건 체크 -> 번거로움
// -> 연산자 사용

// Null-Safe Operator //
// ?.
// 참조 연산자를 실행하기 전에 먼저 객체가 null인지 확인
// -> 객체가 null이면 ?. 뒤에 따라오는 구문을 실행하지 않음

// Elvis Operator //
// ?:
// 객체가 null이 아니라면 그대로 사용
// -> null이면 ?: 뒤에 따라오는 객체로 대체

// Non-Null Assertion Operator //
// !!.
// 참조 연산자를 사용할 때 null 여부를 컴파일시 확인하지 않음
// -> 런타임시 null pointer exception이 나도록 의도적으로 방치

fun main() {

	// 그냥 공백(null 아님)
    val test13 = ""
    println(test13)

    // null <- 대충 슈뢰딩거의 값(undefined, 0, ""와는 다름)
    val test14 = null
    println(test14)

    // null은 문자열이 아니기 때문에 -> 에러 발생
//    val test15 : String = null
    // Kotlin: Null can not be a value of a non-null type String
    
    // test16은 String 또는 null이다
    val test16 : String? = null



    var a: String? = null

    // null이므로 대문자 적용 안 함
    println(a?.toUpperCase())
//    null

    // null이므로 default로 대체 후 대문자 적용
    println(a?:"default".toUpperCase())
//    DEFAULT

// null pointer exception 발생
//    println(a!!.toUpperCase())
//    Exception in thread "main" java.lang.NullPointerException

    // null을 체크하기 위해 스코프 함수를 if문 대신 사용
    a?.run {
        println(toUpperCase())
        println(toLowerCase())
    }
    // null이므로 실행 안 됨

    var b : String? = "Kotlin"

    b?.run {
        println(toUpperCase())
        println(toLowerCase())
    }
//    KOTLIN
//    kotlin

}

Null Safe Operator(?.), Non-Null Assertion Operator(!!.), Elvis Operator(?:)

fun main() {

//    val x: Int = null
//    Kotlin: Null can not be a value of a non-null type Int

//    val y: String = null
//    Kotlin: Null can not be a value of a non-null type String

//    ?은 null인지 아닌지를 확인(포함한다고 봐도 됨)
//    변수값을 null로 지정하되 에러 안 나려면 변수타입에 ? 붙이기

    val x: Int? = null
    val y: String? = null



    val name: String? = null
    
//    println(name.length)
//    Kotlin: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
//    값이 null일 때 ? 사용해 오류 없이 null 반환함
    println(name?.length)
//    null



    var name2: String? = null
    
    name2 = "Treehouse"
//    값이 null이 아니라고 장담할 수 있을 때 !! 사용
    println(name2!!.length)
//    9

}
fun main() {

    // test1에 test2의 값을 넣음 -> "a"가 "b"로 바뀜
    var test1 : String = "a"
    var test2 : String = "b"
    test1 = test2
    println(test1)
//    b

    // test3에 test4의 값을 넣음 -> ?(null 일수도) 때문에 에러남
    // !!(null 아님)를 붙여주면 에러가 나지 않음
    var test3 : String = "c"
    var test4 : String? = "d"
//    test3 = test4
//    Type mismatch: inferred type is String? but String was expected
    test3 = test4!!
    println(test3)
//    d
    
    

//    var testStr1 : String = ""
//    println(testStr1)
//

//    var testStr2 = null
//    println(testStr2)
//    null

//    // 단순 문자열은 String
//    var testStr3 : String = "abcd"
//    // null 포함하려면 String?
//    var testStr4 : String? = null

    println(findStringLength1("qwerasdf"))
    println(findStringLength2(null))
    println(findStringLength3("1234"))
    println(findStringLength4(null))
//    8
//    null
//    4
//    0

}

// null이면 에러남
fun findStringLength1(str : String) : Int {
    return str.length
}

// null이면 null 리턴
fun findStringLength2(str : String?) : Int? {
    return str?.length
}

// null이면 0 리턴
fun findStringLength3(str : String?) : Int {
    var resultCount = 0
    if(str != null) {
        resultCount = str.length
    }
    return resultCount
}

// null이면 0 리턴
fun findStringLength4(str : String?) : Int? {
    return str?.length ?: 0
}

참고

 

[입문편] 안드로이드를 위한 코틀린(Kotlin) 문법 - 인프런 | 강의

코틀린 문법 기초 강의입니다. 안드로이드 앱을 코틀린 언어로 개발하고 싶으신 분들을 위한 강의이고, 기초부터 튼튼하게 코틀린 문법을 재미있게 공부할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

반응형

'개발(Android) > kotlin syntax' 카테고리의 다른 글

[Kotlin syntax] Arguments, Infix Functions  (0) 2022.04.08
[Kotlin syntax] Equality  (0) 2022.04.08
[Kotlin syntax] String Formatting  (0) 2022.04.07
[Kotlin syntax] Collections (1) Lists  (0) 2022.04.07
[Kotlin syntax] Generic  (0) 2022.04.07