Uknow's Lab.
article thumbnail

 

 

코틀린은 설계부터 null을 고려하여 설계된 언어입니다.

nullPointerException. 자바 개발자라면 정말 많이 마주쳤고, 그리고 마주칠 오류죠.

코틀린의 null 안전성을 고려한 설계는 개발자들이 null 값을 다룰 때, 개발자들의 실수를 줄여줄 수 있을 겁니다.

 

코틀린의 nullable

var a: Int = null // 오류 발생!
var a: Int? = null // ? 키워드를 붙여줌으로써 null 값을 가질 수 있도록 만듬

코틀린에서는 자료형 뒤에 ?를 붙임으로써 nullable(null값을 가질 수 있음)하게 만들 수 있습니다.

코틀린 표준 입출력편에서 나왔던 readln()과 readLine()의 차이점, 기억나시나요?

readLine()는 null을 입력으로 받을 수 있지만, readln()은 null을 허용하지 않는다는 점 이였습니다.

 

null safe 연산자 ?.

var a: String? = "ASDF"

println(a.length) // a가 nullable이기 때문에 에러 발생!
println(a?.length) // 만약 a가 null일 경우 실행하지 않음, 4 출력

String.length는 문자열의 길이를 반환하는 메소드입니다.

하지만 nullable한 변수에 그냥 접근하려 하면 에러가 발생합니다.

nullable한 변수에 접근하려면 ?를 붙여 null값인지 체크를 하고 사용하여야 합니다.

만약 a?.length에서 a가 null이라면, 뒤의 length 메소드는 실행되지 않습니다

 

// 자바 코드
String str = null

if(str != null) {
	System.out.println(str.length)
}

자바에서 null인지 체크하기 위해 if(str==null)과 같이 if문을 사용해 체크하는 형태를 흔히 볼 수 있습니다.

한 개면 괜찮습니다... 하지만 if문을 중첩하여 2, 3중으로 중첩 체크하는 순간 코드가 정말 보기 싫게 생겨집니다...

하지만 코틀린에서는 ?. 이라는 간단한 표현으로 나타내 가독성과 편리성을 챙겼습니다.

 

non-null 연산자 !! (강조 의미 아님)

val str: String? = "ㅁㄴㅇㄹ"

println(str!!.length)

// 출력
>> 4

!!연산자는 해당 객체가 절대 null이 아님을 명시할 때 쓰입니다.

만약 null인 객체에 !!를 사용하면 nullPointerException이 발생합니다.

 

하지만 !! 연산자를 쓰는 것은 권장되지 않으며,

!!가 단 하나라도 있는 코드는 잠재적인 위험이 있는 코드로 취급하기도 합니다.

?.으로 안전한 호출을 하는 것이 좋습니다.

 

 

Elvis 연산자 ?:

fun main() {
    val a:String? = null
    val str = a?:"a is null"

    println(str)
}

// 출력
>>> a is null

===========================================

fun main() {
    val a:String? = "Hello?"
    val str = a?:"a is null"

    println(str)
}

// 출력
>>> Hello?

?:는 엘비스 연산자로써, 해당 객체가 null이 아니라면 실행을,

null이라면 디폴트 값을 발생시키는 연산자입니다.

첫 번째 코드는 a가 null 이므로 디폴트값으로 준 "a is null"이 str에 대입되었습니다.

두 번째 코드는 a가 null 이 아니므로 str = a가 그대로 실행되어 str에 a가 담긴 모습입니다.

 

여담으로, ?:는 가수 엘비스 프레슬리의 머링모양을 닮았다 해서 붙은 이름입니다.

으음... 그런가?

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.