코틀린의 변수 선언은 기본적으로 null을 허용하지 않는다. (NotNull)
fun main() {
var a: Int = 30
a = null # 오류 발생!
}
따라서 '?'를 이용하여 null이 가능한 선언을 할 수 있다. (Nullable)
fun main() {
var a: Int? = 30
a = null
}
여기서 Int?는 Int와는 전혀 다른 종류의 자료형이다.
null을 허용한 타입으로 str1 문자열을 선언하고, 문자열 길이를 반환하는 length함수를 그냥 호출하면 오류가 발생한다.
fun main() {
var str1: String? = "Hello Kotlin"
println("str1: $str1 length: ${str1.length}")
}
String? 타입을 null을 허용하지 않는 String타입으로 바꾸거나
fun main() {
var str1: String = "Hello Kotlin"
println("str1: $str1 length: ${str1.length}")
}
!!.을 사용하여 해당 변수가 null이 아님을 컴파일과정에서 단정지어주어야한다.
fun main() {
var str1: String? = "Hello Kotlin"
println("str1: $str1 length: ${str1!!.length}")
}
그러나 !!.을 사용하여 단정지었지만 변수에 null값이 들어가 버린 경우 NPE가 발생한다.
+ NPE(NullPointerException): 사용할 수 없는 null인 변수에 접근하면서 발생하는 예외
fun main() {
var str1: String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1!!.length}")
}
따라서 실제로 null값이 변수에 들어갈 수 있는 상황이라면 !!.을 지양하고 세이프콜(Safe-call) ?.을 사용하여 str1이 null값일 경우 null을 반환하도록 해야한다.
fun main() {
var str1: String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1?.length}")
}
조건문으로 null 값을 허용한 변수를 통해 함수를 사용할 수 있다.
fun main() {
var str1: String? = "Hello Kotlin"
str1 = null
val len = if (str1 != null) str1.length else -1
println("str1: $str1 length: ${len}") // str1: null length: -1
}
세이프 콜과 엘비스 연산자 ?:를 이용하여 더 간단하게 null을 허용할 수 있다.
fun main() {
var str1: String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1?.length ?: -1}") // str1: null length: -1
}
'Study > Kotlin Study' 카테고리의 다른 글
| [Kotlin] 증가 감소 연산자 (1) | 2023.08.20 |
|---|---|
| [Kotlin] Smart Cast (0) | 2023.08.19 |
| [Kotlin] 자료형 변환 (0) | 2023.08.18 |
| [Kotlin] 기본형 VS 참조형 (0) | 2023.08.18 |
| [Kotlin] == VS === (0) | 2023.08.18 |