본문 바로가기
쿤즈 Dev/Kotlin

[Kotlin] 자료형 검사하기 (Null Point Exception)

by :)Koon 2022. 5. 8.

지난 포스팅에서 변수와 자료형에 대해서 알아보았습니다. 특히 자료형은 여러가지 자료형을 알아보고 사용하는 방법, 그리고 자동 추론됨과 명시적으로 선언하는 방법까지 알아보았습니다.

2022.05.01 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린 변수의 종류와 사용방법

 

[Kotlin] 코틀린 변수의 종류와 사용방법

지난 포스팅에서 intelliJ를 이용해서 코틀린 프로젝트를 생성하는 방법을 알아보았습니다. 2022.04.30 - [쿤즈 Dev/Kotlin] - [Kotlin] 프로젝트 만들기 (feat. Hello Kotlin) [Kotlin] 프로젝트 만들기 (feat. H..

koonsland.tistory.com

2022.05.03 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린 자료형 알아보기

 

[Kotlin] 코틀린 자료형 알아보기

지난 포스팅에서 코틀린의 변수에 대해서 알아보았습니다. 2022.05.01 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린 변수의 종류와 사용방법 [Kotlin] 코틀린 변수의 종류와 사용방법 지난 포스팅에서 intelliJ를 이

koonsland.tistory.com

자료형에 대해서 조금 더 알아보기 위해서 이번 포스팅에서는 자료형 검사하는 방법과 NPE(Null Point Exception)에 대해서 알아보도록 하겠습니다.


코틀린 null 변수 검사

코틀린의 특이한 점은 변수를 사용할 때 반드시 값을 할당해야 한다는 것입니다. 값이 할당되지 않으면 코틀린에서는 오류를 발생시킵니다. 그리고 이렇게 값이 없는 상태를 null이라 부릅니다.

 

대부분의 프로그래밍에서 null값은 프로그래머들이 항상 고려해야 하는 부분중 하나입니다. 하지만 코틀린은 변수에 null을 허용하지 않기 때문에 이러한 문제들에서 벗어날 수 있게 되었습니다. 예제를 통해서 알아보겠습니다.

 

package `02`

fun main(args: Array<String>) {
    var str1: String = null;

    println("str1: $str1")
}

 

IntelliJ에서는 String 자료형으로 선언된 변수에 null을 대입하면 아래와 같은 경고를 보여줍니다.

IntelliJ에서 String 자료형에 null을 대입했을때 표시

이 프로그램을 실행하면 어떻게 될까요?

Kotlin: Null can not be a value of a non-null type String

위와 같은 에러가 발생합니다. String 타입의 자료형에는 null값을 넣을 수가 없습니다. 컴파일 단계에서 이미 오류를 발생시킵니다. 그럼 null을 넣을 수 있는 방법이 있을까요? 네. 바로 물음표(?)를 자료형 뒤에 넣어주는 것입니다. 다시 소스코드를 볼게요.

 

package `02`

fun main(args: Array<String>) {
    var str1: String? = null;

    println("str1: $str1")
}

 

자료형 뒤에 물음표를 넣어주면 null 값을 넣을 수 있습니다. 이렇게 null을 허용한 변수를 사용하면 결과를 출력할 때 문제가 발생합니다. 예제를 통해서 볼게요.

 

package `02`

fun main(args: Array<String>) {
    var str2: String? = null

    println("str2: $str2, str2.lenth: ${str2.length}")
}

 

str2는 null을 허용한 변수입니다. 하지만 null 값이 대입되었을 경우 ${str2.length} 값은 가져올 수 없습니다. 그래서 IntelliJ에서는 아래와 같이 알려줍니다.

 

 

이 경우에는 세이프 콜 또는 non-null asserted 콜을 이용해서 출력을 할 수 있습니다.

package `02`

fun main(args: Array<String>) {
    var str2: String? = null
    var str3: String? = null

    println("str2: $str2, str2.lenth: ${str2?.length}") // 세이프콜
    println("str3: $str3, str3.lenth: ${str3!!.length}") // non-null asserted 콜
}

 

출력시 물음표(?)를 붙여서 출력하면 str2의 값이 null인지를 판단한 후에 null일 경우는 length 값을 보는 것이 아닌 null을 출력하도록 합니다.  만약 느낌표 2개(!!)를 이용해서 출력한다면 컴파일 단계에서는 오류가 나지 않지만 실행단계에서 NPE를 강제로 발생시킵니다.


이번 포스팅에서는 null 관련하여 코틀린이 어떻게 동작하는지 알아보았습니다. NPE(Null Point Exception)을 컴파일 단계에서 확인할 수 있다는것도 코틀린의 가장 큰 장점이 아닌가 싶습니다. 다음 포스팅에서는 변수에 저장된 값을 비교하는 방법을 알아보겠습니다.

댓글