이번 포스팅에서는 Kotlin 에서 언어 자체로서의 장점으로 이야기 하는 Null-Safe에 대해서 알아보도록 하겠다.
Kotlin에서 Safe 하다고 이야기 하는 부분은 크게 두가지로 나누어진다.
첫째, Nullable Type 명시를 통한 NullPointerException을 컴파일 타임에서 방지하는 점
둘째, 컴파일러에 의한 AutoCast를 통해서 MissCasting Error 를 줄일 수 있는 점
이중에 Nullable 에 대해서 알아보도록 하자
Nullable Type & Non-Null Type
fun test(){
var a : Int = 3
a = null // Compile Error
var b : Int? = 4
b = null // Compile Success
}
Kotlin에서는 기본적으로 "?" 는 null을 의미한다. Default 로는 Null을 허용하지 않고 Nullable 한 경우에는 "?"를 붙여서 Null 이 가능함을 나타내야 한다.
위 문장에서 a라는 변수는 default로 Null을 할당할경우 컴파일 타임에서 에러가 발생하지만, b같은 경우에는 ? 로 Null 이 가능하다고 표현하였기 때문에 에러가 발생하지 않고 Null 할당이 가능하다.
Safe Calls
Nullable Type 응 그래 이제 뭔지 알겠다. 그래서 ?? 개발자가 코드를 작성할때 뭐가 좋아지지? 라고 묻는다면 하나의 예제를 보여주겠다.
Nullable type을 그대로 참조할 경우에 컴파일 타임에서 에러가 발생하므로 개발자로 인해 발생하는 NPE에 대해서 막을 수 있다. 물론 100% 막을 수 있는건 아니지만, 개발을 하면서 NPE 발생에 대해서 생각할 수 밖에 없는 구조로 만들어져 있다.
fun test(){
val name: String? = null // Nullable type
println(name.length()) // Compilation error
}
아래와 같은 인스턴스에 값을 할당한다고 생각 해보자. NPE를 발생 시키지 않기 위해서는 어떻게 해야 할까.
fun test(){
var headLength = bob.department.head.length
}
일반적인 코딩을 생각하면 아래와 같이 모든 인스턴스에 대해서 Null 체크를 해줘야 한다.
if(bob != null && department != null & haed != null){
bob.department.head.length = 3
}
하지만 Kotlin 에서는 Nullable을 직접 명시하기 때문에 아래와 같이 표현이 가능하다.
fun test(){
var size = bob?.department?.size
print(size)
}
bob, Department 가 Nullable 이기 때문에 Null을 참조하더라도 바로 NPE가 발생하지 않고 , bob 이나 deprtment가 null 이라면 size 는 null 로 셋팅이 될 것이다.
위와 같은 경우에 default 값을 선언하기 위해서 Kotlin에서는 Elvis Operator 라는 것을 재공한다.
Elvis Operator
만약에 어떤 값이 Null 일경우 특정 값을 할당하는 경우 어떻게 표현해야 할까 ? If-else 구문을 활용하면 다음과 같이 표현 할 수 있다.
fun test(){
var size = if(bob.department != null) bob.department.length else -1
}
이런 표현식의 경우에 Elvis Operator ?: 을 활용하면 훨씬 쉽게 표현이 가능하다. ?: 의 다음에 오는 값이 앞에 오는 인스턴스가 NULL 일때 Default 값이라고 보면 될거 같다.
fun test(){
var size = bob?.department?.length ?: -1
}
Elvis Operator 를 응용하면 아래와 같이 Null 값에 대한 유효값 처리를 할 수 있다.
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
}
!! Operator
non-null 을 나타내는 !! Operator가 있지만 NullPointer를 발생 시킬 가능성이 있기 때문에 최대한 해당 Operator의 사용은 피하는게 좋다.
굳이 Null Safe 한게 싫은 경우 사용하기를 바란다.(아무 생각 없이 코딩을 하다 보면 안드로이드 스튜디오 에러를 막기 위해서 !! 로 도배가 된다는 슬픈 전설이)
Collections of Nullable Type
Collection 타입에서 Null과 Non-Null Object를 필터할 수 있는 메소드가 제공된다. 사용법은 아래와 같다.
fun test(){
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()
}
'Programming' 카테고리의 다른 글
Kotlin Syntax (2) - Control Flow (0) | 2017.07.05 |
---|---|
Kotlin Syntax (1) - Basic Type (1) | 2017.07.03 |
Java8 Lambda 최대값 갯수 표현식 (0) | 2017.06.04 |
[JavaScript] Switch - Fall Through (0) | 2017.05.28 |
RecyclerView, Cardview Example (0) | 2017.05.28 |