코틀린을 시작하면서 느낀 가장 큰 차이점은 두 가지다.
- null에 엄격하다.
- 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
'Android' 카테고리의 다른 글
Object Expressions 코틀린 기초 문법 (3) - Koans 풀이 (0) | 2020.01.28 |
---|---|
Extension fun, 코틀린 기초 문법 (2) - Koans 풀이 (0) | 2020.01.27 |
단 5분, 단숨에 AsyncTask 완벽 정복! (0) | 2020.01.23 |
doAsync, AsyncTask, Coroutines 안드로이드 비동기 정답은?! (0) | 2020.01.22 |
안드로이드, 코틀린?! Adapter/?? 이게 다 뭐야!! 고통스러워!!!!! (1) | 2020.01.19 |