본문 바로가기
Programming

Kotlin null 처리하는 방법

by 하하호호 2022. 3. 7.
반응형

 

 

Kotlin에서 null이란?

 

null은 기본값이 정해지지 않은 상태를 의미한다.

실제로 변수를 생성하고 초기화를 하지 않는 경우,

자동으로 null 값이 할당된다.

 

값이 없는 상태인 null 로 지정되면 NullPointerException

발생될 수 있기 때문에 null 처리는 중요하다.

 

Kotlin null 가능 타입 vs null 불가능 타입

코틀린에서 변수는 nullable(null 가능 타입)과 

non-nullable(null 불가능)으로 나뉘게 된다.

 

non-null 타입 변수에 null 값을 할당하면 

에러가 난다.

fun main(args: Array<String>) {

    var nullTest = "testNull"
    //Null cannot be a value of a non-null
    nullTest = null
}

 

 

String? 은 명시적으로 null 값을 허용한다는 뜻이다.

readline() 함수 반환값을 String 혹은 null 값으로 반환

한다는 뜻이다.

 

main 함수에서 변수에 readline() 반환값을 저장하면

정상적으로 null 값이 출력된다.

fun main(args: Array<String>) {

    var signature = readline()
    println(signature)

}

public fun readline(): String?{
    var text = null
    return text
}

 

코틀린은 컴파일 기반 언어기 때문에, 컴파일을 할 때

컴파일러가 기초적인 에러요소들을 잡아준다. 코틀린

컴파일러는 null 가능 타입에 null이 들어있는지, null 불가능

타입에 null이 들어있지는 않은지 미리 확인해준다.

 

컴파일 에러와 반대로 런타임 에러는 프로그램이 문제없이

컴파일 되고 나서 프로그램 실행 중 발생하는 에러다. 자바는

null 가능과 불가능 타입을 구분하지 않기 때문에, 자바 컴파일

만으로는 NullPointerException 에러를 잡기가 어렵다.

 

Kotlin null 에러 예방하는 방법

1) 안전호출 연산자 사용하기

안전 호출 연산자(safe call operator)?. 기호다.

해당 변수가 null 값을 받지 못한다는 것을 컴파일러에게

명시적으로 알려주는 것이다.

 

 

capitalize() 함수는 String 값을 대문자로 변경해주는 기능을

가진다. 안전 호출 연산자 "?."를 사용하면 null 값인 경우에는

호출되지 않고, 아닌 경우 호출이 된다. 

 

fun main(args: Array<String>) {
    var signature = readline()?.capitalize()
    println(signature)

}

public fun readline(): String?{
    var text = null
    return text
}

 

 

2) let 함수 사용

let 함수를 통해서 null인경우와 아닌 경우를 구분하여

로직을 구성할 수 있다. 아래 예시에서는 null이 아닌

경우 let 함수가 호출되고 빈문자열이 아닌경우(isNotBlank() == true)

captialize() 함수가 호출된다.

fun main(args: Array<String>) {
    var signature = readline()?.let{
        if(it.isNotBlank()){
            it.capitalize()
        }else{
            "테스트"
        }
    }
    println(signature)

}

public fun readline(): String?{
    var text = null
    return text
}

 

3) non-null 단언 연산자 사용

non-null 단언 연산자(assertion operator) 연산자는 !! 다.

해당 값이 null이 될 수 없다는 것을 명시적으로 표시하는 

장치다.

 

만약 해당 변수값이 null이면 런타임 시점에 NullPointerException을

발생시킨다.

 

fun main(args: Array<String>) {
    var signature = readline()!!.capitalize()
    println(signature)

}

public fun readline(): String?{
    var text = null
    return text
}

NullPointerException 출력 결과

Exception in thread "main" java.lang.NullPointerException
	at TavernKt.main(Tavern.kt:2)

 

 

4) if~else 조건문 사용

가장 간단한 방법이다. if 문으로 해당 변수가

null인지 판단한 후 로직을 구성하는 것이다.

fun main(args: Array<String>) {
    var signature = readline()

    if(signature!=null) signature=signature.capitalize()
    else println("signature은 null 값이다.")
    
    println(signature)

}

public fun readline(): String?{
    var text = null
    return text
}

 

 

Kotlin Elvis Operator

null 복합 연산자다. 표기는 ?: 을 사용한다.

왼쪽 값이 null이면 오른쪽 값을 할당한다.

 

signature 변수에는 null을 반환하는 readline() 함수

반환값이 할당된다. elvisoperator 변수에 null 복합

연산자를 할당해서 만약 signature가 null 이면 

"엘비스는 살아있다"를 출력한다.

 

 

fun main(args: Array<String>) {
    var signature = readline()

    var elvisoperator: String = signature ?: "엘비스는 살아있다"
    println(elvisoperator)

}

public fun readline(): String?{
    var text = null
    return text
}

 

 

 

 

 

Kotlin은 JAVA를 삼킬 수 있을까? Kotlin을 사용하는 이유

What is Kotlin? JAVA는 오랜 시간 Enterprise 시장을 지배한 언어다. 안드로이드, 정부 표준 웹 프레임워크 등 굵직한 프로젝트에 사용되기 시작하면서 JAVA의 위상을 건드릴 언어는 없다. Python은 다목적

incomeplus.tistory.com

 

 

Kotlin Hello World 출력하기

Kotlin Programming 언어 자바로 서비스를 만들고 있다. 스프링 웹 프레임워크를 이용해서 백엔드를 만들고, mysql을 통해 데이터 모델링을 진행한다. 자바로 충분히 커버가 가능하지만, 코틀린을 배워

incomeplus.tistory.com

 

 

Kotlin 변수 상수 타입 지정하는 방법 코틀린에서 변수 내장타입은?

Kotlin 변수와 상수 코틀린은 정적 타입 시스템(Static type System)을 사용한다. 즉 소스 코드에 정의된 타입을 컴파일 시점에 알 수 있다는 뜻이다. 코틀린에서 변수를 새로 만들어보자. fun main(args: Arr

incomeplus.tistory.com

 

 

Kotlin when 문법 사용하는 방법

Kotlin when Kotlin에서는 if~else문의 기능과 동시에 when 기능을 제공한다. JAVA에서 switch ~ case 문법과 유사한 문법기능이다. when 표현식에 매개변수가 전달되며, 매개변수의 값에 따라서 프로그램 기능

incomeplus.tistory.com

 

 

반응형

댓글