jhhan의 블로그

Kotlin(3) - Null 본문

Kotlin

Kotlin(3) - Null

jhhan000 2020. 7. 6. 15:32

코틀린에 대해 적는 세번째 포스트 입니다.

 

이번에는 Null에 대해 알아보겠습니다.

Kotlin에서는 변수를 사용할 때 반드시 값을 할당해줘야 합니다.

그래서 변수를 선언하고 값을 할당해주지 않으면 오류가 생깁니다.

 

var str1: String
println(str1)

만약 다음과 같이 코드를 작성하고 실행을 한다면 오류가 생깁니다.

물론 실행하기도 전에 빨간 줄이 나타나서 오류가 생긴 것을 알 수 있습니다.

물론 이렇게 해도 오류가 생깁니다.

 

이를 해결하기 위해서 null을 허용하는 변수들을 사용해야 합니다.

간단합니다. 자료형 타입 뒤에 물음표를 붙이면 됩니다.

    var str1: String?
    str1 = null
    println(str1)

이렇게 사용하면 오류가 뜨지 않습니다.

결과도 이렇게 null로 잘 뜹니다.

또 다른 예시를 보겠습니다.

    var num1: Int?
    num1 = null
    println("num1: $num1")
    num1 = 3
    println("num1: $num1")

이렇게 작성하시면

결과가 잘 뜨는 것을 확인하실 수 있습니다.

 

다음은 null일 경우 계산이 안되는 경우에 대해 보겠습니다.

var str1: String?
str1 = null
println("str1: $str1, length: ${str1.length}")

str1이 String?로 선언되었으므로 null값을 허용합니다.

하지만 str1의 값이 null이므로 length는 구할 수 없습니다.

실제로도 빨간 줄이 생긴 것을 확인할 수 있습니다.

이런 경우를 대비해서 코틀린에는 세이프 콜이 있습니다.

세이프 콜: 변수를 검사해서 안전하게 호출하도록 도와주는 연산자

사용법은 간단합니다. 변수뒤에 물음표를 붙이면 됩니다.

var str1: String?
str1 = null
println("str1: $str1, length: ${str1?.length}")

str1뒤에 물음표를 붙이고 원하는 메서드를 실행하면 됩니다.

결과가 정상적으로 나오는 것을 확인할 수 있습니다.

 

다음은 non-null 단정 기호에 대해 알아보겠습니다.

non-null 단정기호: null이 아니라고 단정해줌 -> 컴파일러가 null검사없이 계산을 진행

non-null의 경우 null인 경우에 문제가 생깁니다. 

    var str1: String?
    str1 = null
    println("str1: $str1, length: ${str1!!.length}")

아까의 코드를 아주 조금 바꿨습니다.

실제 코드 상에서도 아무 문제가 없는 것으로 보입니다.

하지만 실행을 한다면

다음과 같은 NPE(NullPointerException)이 발생한 것을 알 수 있습니다.

이제 다음과 같이 바꿔보겠습니다.

    var str1: String?
    str1 = "Hello"
    println("str1: $str1, length: ${str1!!.length}")

이렇게 해야 오류가 발생하지 않는 것을 알 수 있습니다.

그렇기 때문에 null이 될 가능성이 없다고 생각할 때 사용하면 될 것 같습니다.

 

다음으로 엘비스 연산자에 대해 알아보겠습니다.

먼저 코드를 살펴보겠습니다.

    var str1: String?
    str1 = null
    var len = if(str1 != null) str1.length else -1
    println("str1: $str1, length: $len")

이 코드를 실행한다면

문제없이 실행이 되는 것을 확인할 수 있습니다.

여기서 조금 더 살펴보면

세번째 줄에 if문 안에 노란색 음영이 된 것을 볼 수 있습니다.

저기에 대고 alt+enter를 친다면

elvis expression으로 대체한다는 문구를 볼 수 있습니다.

elvis로 바꿔보겠습니다.

    var str1: String?
    str1 = null
    var len = str1?.length ?: -1
    println("str1: $str1, length: $len")

세번째 줄이 조금 더 간편해진 것을 볼 수 있습니다.

str1이라는 변수가 null이 아닐 경우 length 계산을 해줄테지만,

그렇지 않다면 -1을 반환할 것입니다.

코드의 결과입니다.

    var str1: String?
    str1 = "Kotlin"
    var len = str1?.length ?: -1
    println("str1: $str1, length: $len")

코드를 조금 바꾼 후 다시 실행해 보겠습니다.

코드의 결과입니다.

2개의 예시 모두 정상적으로 출력이 되는 것을 확인할 수 있습니다.

 

이렇게 null을 처리하는 방법에 대해 간략하게 알아봤습니다.

세이프 콜과 엘비스 표현식을 사용한다면 null값이 있더라도 문제없이 처리할 수 있을 것입니다.

이것으로 마치겠습니다.

'Kotlin' 카테고리의 다른 글

Kotlin(4) - 함수 관련  (0) 2020.07.08
Kotlin(2) - 변수  (0) 2020.06.28
Kotlin 시작하기  (0) 2020.06.27