POST

Kotliin 코틀린 null변수의 세이프 콜과 엘비스 연산자

null을 안전하게 사용하고 싶다면 세이프 콜과 엘비스 연산자를 쓰자

Kotlin 코틀린 변수에 null 할당 하는 방법

 

이전 포스팅에서 처럼 코틀린에서는 기본적으로 null을 허용하지 않지만 사용을 하려면 자료형 뒤에 물음표(?)를 붙여 사용하면 된다고 했습니다. 하지만 무작정 null변수만 사용을 하게 되면 아래와 같은 작업을 하게 될 경우 실행할 수 없게 됩니다.

var strNull: String? = null // 자료형에 (?)를 사용해 null사용가능한 자료형으로 선언
println("strNull = $strNull , length = ${strNull.length}) // srtNull 변수의 값과 길이를 출력

 

이 경우에 대비하여 세이프 콜과 엘비스 연산자를 사용하면 프로그램을 잘 실행할 수 있습니다.

둘의 사용에 앞서 서로 비슷하지만 다른 세이프 콜과 non-null단정 기호를 알아보겠습니다.

 

세이프 콜과 non-null 단정 기호


세이프 콜과 non-null 단정 기호는 서로 다른 의미를 가집니다.

먼저 아래처럼 작성 후 세이프 콜을 사용하여 작성해봅시다.

세이프 콜은 물음표(?)와 점(.)으로 구성됩니다.

 

var strNull: String? = null // null 사용가능한 자료형으로 변수 선언
println("strNull: $strNull , length: ${strNull?.length}") // (?.)기호를 이용해 세이프 콜 사용

 

세이프콜

해당 변수를 검사 후 null이 발견되면 length와 같은 코드에 접근하지 않고 그대로 null을 내보냅니다.

반면에 non-null단정 기호는 해당 변수의 값이 null이 아니라고 단정을 하도록 하는 것입니다. 이것은 코딩 시 아무런 에러가 나타나지 않지만(코딩 시 오류를 무시) 프로그램을 실행하게 되면  NPE(NullPointerException)을 발생시킵니다. 

non-null 단정 기호는 느낌표(!)와 점(.)을 사용합니다.

var strNull: String? = null // null 사용가능한 자료형으로 변수 선언
println("strNull: $strNull , length: ${strNull!!.length}") // (!!.)기호를 이용해 non-null 단정 기호 사용

 

non-null 단정 기호

 

세이프 콜과 엘비스 연산자


세이프 콜과 엘비스 연산자를 함께 사용하 게 되면 null을 사용한 변수를 더욱 안전하게 사용이 가능합니다.

엘비스 연산자는 변수 값의 null 여부를 검사 후 null이 아니라면 왼쪽식을, null이 맞다면 오른쪽식을 실행합니다.

엘비스 연산자는 물음표와(?) 콜론(:)을 사용합니다. 아래의 코드를 작성하여 확인해 봅시다.

 

var strNullT: String? = null // 값이 null인 변수
var strNullF: String? = "Hello Kotlin" // 값이 null이 아닌 변수

println("strNullT: $strNullT , length: ${strNullT?.length ?: -1}) // 값이 null인 변수
println("strNullF: $strNullF , length: ${strNullF?.length ?: -1}) // 값이 null이 아닌  변수

 

세이프콜과 엘비스 연산자

세이프 콜과 엘비스 연산자를 사용하면 null인 경우 반환 값을 -1과 같은 특정값으로 대체 함으로써 null 발생을 대비할 수 있으므로  안전하고, 코드를 한 줄에 표현할 수 있어 가독성이 좋아집니다.

 

이 외에 조건문을 이용하여 null을 검사하기도 합니다. NPE는 null을 허용한 변수의 값이 null일 가능성을 검사하기만 하면 오류는 나타나지 않습니다.