본문 바로가기

Android

null? 코틀린 기초 문법 (1) - ? ?: !!

반응형

코틀린을 시작하면서 느낀 가장 큰 차이점은 두 가지다.

  1. null에 엄격하다.
  2. read/write 변수(immutable)와 read-only 변수(mutable)를 구분한다.

코틀린은 함수형 프로그래밍의 패러다임을 받아들였고, 하나의 함수는 입력값과 출력값에 관계된 작업만 수행해야 한다. 이런 환경에서는 당연히 null 값에 민감하게 반응할 수 밖에 없고, 때문에 코틀린에는 ? 연산자가 있다.

null 값을 처리하기 애매한 환경이지만, 물론 null을 할당하는 경우가 생긴다. 예를 들어 parseInt 함수를 통해 String을 Int로 바꿀 때, String에 숫자 정보가 없을 수 있다. 이렇게 값이 null이 될 수 있는 변수를 nullable 변수라 하며, 자료형 뒤에 ? 연산자를 붙여 표현한다. 다음은 parseInt 함수의 일부분이다. String 형태 변수 str을 입력으로 받고 null이 될 수 있는 Int? 형태의 변수를 반환한다.

fun parseInt(str: String): Int? {
    // ...
}

nullable 변수가 선언되면, 그 값을 사용할 때 항상 값이 null인지 체크해줘야 한다.

var b: String? = "abc"
b = null // ok
val l = b.length // error: variable 'b' can be null

if를 이용하여 null check

아래 코드처럼 inline if 구문을 이용하여 체크하는 방법이 있다. 이렇게 처리하면 두 가지 상황에 대해 각각 대처할 수 있다.

val l = if (b != null) b.length else -1

?를 이용하여 null check

또다른 방법으로는 아래 코드처럼 ?를 사용하는 방법이 있다. 이 코드는 b가 null일 때 null을 반환하고, b가 null이 아닐 때 문자열의 길이를 반환한다.

val b: String? = null
println(b?.length)

이 문법을 사용하면 아래와 같은 물음표 살인마 코드를 작성할 수 있다.

bob?.department?.head?.name

값이 null이 아닐 때에만 동작하는 코드를 만들고 싶다면 let을 이용하는 게 좋다.

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
    item?.let { println(it) } // prints Kotlin and ignores null
}

맨 처음 if ... else ...를 ? 연산자를 통해 구현하기 위해 ?: 연산자를 사용한다. ?: 연산자는 elvis 연산자라고도 하는데, 이는 ?:를 시계 방향으로 90도 뒤집으면 엘비스 프레슬리 모양이 되어서.. 라고 한다. 이상한 사람들..

val l = if (b != null) b.length else -1

// or

val m = b?.length ?: -1

!!를 이용하여 null check

!!는 not-null assertion operator로 불리며, 모든 값을 not-null 형태로 변경한다. 주어진 값이 null이면 NPE(Null Pointer Exception) 에러가 발생한다.

val l = b!!.length

출처:

https://kotlinlang.org/docs/reference/basic-syntax.html
https://kotlinlang.org/docs/reference/null-safety.html

반응형