Programming/Kotlin
Kotlin Null Safety
Albothyl
2022. 4. 23. 12:57
//기본적으로 not null
var a: String = "abc" // Regular initialization means non-null by default
a = null // compilation error
//null이 들어올 수 있는 경우는 ? 으로 표현
var b: String? = "abc" // can be set to null
b = null // ok
print(b)
// 명확한 조건
val b: String? = "Kotlin"
if (b != null && b.length > 0) {
print("String of length ${b.length}")
} else {
print("Empty string")
}
// null이면 null을 표현
val a = "Kotlin"
val b: String? = null
println(a?.length) // null //Unnecessary safe call
println(b?.length) // 6
// chaining
bob?.department?.head?.name // chain 중 1개라도 null이라면 null
person?.department?.head = managersPool.getManager() // 왼쪽 chain이 모두 not null인 경우에만 오른쪽 값을 할당
// Elvis operator (?:)
val l = b?.length ?: -1 // 아래 코드와 동일한 역활을 한다.
val l: Int = if (b != null) b.length else -1
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ...
}
// !! operator
val l = b!!.length //null이면 NPE 발생 아니면 b의 length를 l에 할당
// safe casts
val aInt: Int? = a as? Int
val a = 2
val aInt: Int? = a as? Int
val b = "2"
val bInt: Int? = b as? Int
println(aInt) // 2
println(aInt) // null
// collections of a nullable type
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull() // 크기가 큰 list에서는 어떤 list 인지에 따라서 성능차이가 많이 발생할 수 있다.