내가 여태껏 공부 해왔던 C나 C++과는 다르게 Kotlin에서는 Null을 사용할 수 있는 변수/사용할 수 없는 변수를 구분하여 변수를 선언해 줄 수 있다.
- Null이 불가능한 선언
- val a:Int = 30
- var b:String = "Hello"
- Null이 가능한 선언
- val a:Int? = null
- var b:String? = null
위와 같이 Null이 불가능한 선언에서는 평소 우리가 알듯 선언을 해주면 되지만 Null이 가능한 선언에서는 자료형 뒤에 ?를 넣어줘서 Null이 가능한지 여부를 검사해주면 된다.
이 때 Null이 가능한지 여부를 검사해주는 것이 중요한데, 이는 NPE 즉, Null Pointer Exception이 발생할 수 있기 때문이다. 이는 null을 사용할 수 없는 변수에 접근하면서 발생하는 예외이다.
String? 형식에서는 세이프콜(?.)이나 Non-Null 단정기호(!!.)를 사용할 수 있다.
세이프콜은 null인 경우 해당 명령을 실행하기 않기 때문에 null을 보내준다.
fun main() {
val str:String? = null
println("str:$str, length: ${str?.length}")
}
결과:
str:null, length: null
Non-Null 단정기호는 Null이 아닐 것이라고 단정하는 것으로, 컴파일러가 오류를 무시하게 만든다.
fun main() {
val str:String? = null
println("str:$str, length: ${str.length}")
}
InteliJ에서 위 코드를 작성해보면 str.length 부분에 빨간 밑줄이 그러지면서 다음과 같은 문구가 뜬다.
fun main() {
val str:String? = null
println("str:$str, length: ${str!!.length}")
}
따라서 위 코드와 같이 Non-Null 단정기호를 넣어주게 되면 해당 오류를 무시하게 된다. 위 코드를 실행해 보면 NPE가 발생한다.
fun main() {
val str:String? = null
val len = if(str!=null) str.length else -1
println("str:$str, length: $len")
}
결과:
str:null, length: -1
위와 같은 방식으로 검사할 수 있다.