프로그래밍 언어/Kotlin

[Kotlin] null 정리

happy_life 2022. 10. 11. 09:48

코틀린에서는 자바와 달리 null을 컴파일 시점에 관리할 수 있습니다. 또한 최상위 프로퍼티, get(), set() 등 자바에서 지원하지 않는 다양항 기능들을 제공합니다. 이번 포스팅에서는 null 관리와, 프로퍼티에 대해 상세히 알아보겠습니다.

 

코틀린 null

null: 아무 것도 참조하지 않는 참조 값의 특별한 상태입니다. null에 대해 멤버 접근을 시도하면 NullPointerException이 발생하는데 이는 최악의 에러 중 하나입니다. 그런데 코틀린에서는 일반 참조형에서는 null을 담을 수 없게 하여 NPE를 예방합니다. 

 

예제 코드

fun isLetterString(s: String) : Boolean {
    if(s.isEmpty()) return false

    for(ch in s) {
        if (!ch.isLetter()) return false
    }
    return true
}

fun main () {
    println(isLetterString("abc"))
    println(isLetterString(null))
}

위와 같이 코드를 작성하면 isLetterString() 함수의 인자로 null이 들어오지 못하게 됩니다.

null 불가능

 

그렇다고 코틀린에서 아예 null을 넣을 수 없는 것은 아닙니다. 코틀린에서 null이 가능하도록 하려면 ?를 입력해 표시를 해주어야 합니다.

fun isBooleanString(s: String?) = s == "false" || s == "true"

 

참고로 null이 가능한 변수와 null이 불가능한 변수를 서로 대입하려고 하면 type mismatch 에러가 발생합니다. 그러나 이러한 경우에도 문맥 상 null이 아니라는 것이 확실해지면 입력이 가능해집니다.

type mismatch/ 해결

 

이렇게만 진행되면 좋겠지만, 객체의 가변 프로퍼티에서는 null이 아니라는 것이 확실하지 않으므로,  위와 같이 수정해줄 수 없습니다. 다른 프로그램에서 str을 수정해버릴 수 있기 때문입니다. 따라서 이러한 경우 지역변수로 변경하면 해결할 수 있습니다. 지역변수는 다른 프로그램에서 수정할 수 없기 때문입니다.

객체 프로퍼티에서 null 수정 불가능/ 지역변수로 바꿔 수정

 

 

 

코틀린 null 관련 연산자

1. 널 아님 단언 연산자(!!)

널이 될 수 있는 타입에 대해 프로그래머가 널이 아니라고 확언해주는 연산자입니다.

fun readInt() = readLine()!!.toInt()

프로그램을 짜다보면 null이 들어갈 수 있는 경우가 생길 수도 있는데, 이는 그 가능성 자체를 막아버립니다. 만약 null이 들어오는경우 KolinNullPointerException이 발생하게 됩니다. 따라서 사용하지 않는 것이 좋습니다.

 

 

2. 안전한 호출 연산자

 

fun readInt() = readLine()?.toInt()

받은 값이 null이 아닌 경우에는 의미 있는 일을 하고, null인 경우에는 null을 반환해줍니다. 

 

 

3. 엘비스 연산자

연산자의 왼쪽 값이 null인 경우 연산자의 오른쪽 값으로 치환헤주는 연산자입니다. return/throw도 사용할 수 있습니다.

fun readInt() = readLine()?.toInt() ?:0
fun readInt() = readLine()?.toInt() ?:return "Unknown"

 

'프로그래밍 언어 > Kotlin' 카테고리의 다른 글

[Kotlin] 객체  (0) 2022.10.13
[Kotlin] 프로퍼티  (0) 2022.10.11
[Kotlin] 코틀린 클래스, 생성자  (0) 2022.10.09
[Kotlin] 코틀린 함수  (1) 2022.10.08
[Kotlin] 코틀린 문자열과 배열  (1) 2022.10.08