kotlin 코틀린 null 컴파일 에러 해결방법 (null, nullable) - elvis ? : , !!
1. 자료형
nullable 타입이 아닌 변수들에 null을 넣을 수 없다.
가령, 문자열로 선언한 변수 name에 null을 넣으면 컴파일 오류가 난다.
ㅣ 가능한 코드
fun main(){
var nullableSentence : String? = " "
nullableSentence = null
}
ㅣ불가능한 코드
fun main(){
var sentence : String = " "
sentence = null
}
2. 내장함수
nullable인 경우 .length, .toLowerCase( )와 같은 함수를 쓸 수 없다.
가령, nullable인 변수 nullableSentence의 길이를 .length로 받으면 컴파일 오류가 난다.
ㅣ불가능한 코드
fun main(){
var nullableSentence : String? = "NANANA"
nullableSentence.length
nullableSentence.toLowerCase()
}
ㅣ 가능한 코드
fun main () {
var sentence = "NANANA"
sentence.length
sentence.toUpperCase()
}
이때 println ( ) 이나 print ( ) 로 출력하면 nullableSentence는 길이 6, nanana 로 출력되고 sentence는 컴파일 에러가 난다.
3. nullable 변수
nullable 에서 길이 확인, 대소문자 바꾸는 기능 사용하려면 다음과 같은 방법이 있다.
1) nullable 변수 != null 로 if, else 사용하기
2) null이 아닌 경우 실행할 코드에 if, else 대신 ?.let { 실행할 코드 }
fun main ( ) {
var sentence : String? = "here is non-null"
sentence?.let{println( sentence.toUpperCase() )}
}
HERE IS NON_NULL 이 출력된다.
fun main ( ) {
var sentence : String? = "here is non-null"
sentence?.let{println( sentence.toUpperCase() )}
}
아무것도 출력되지 않는다.
3) 사용하고자하는 기능 앞에 다시 ? 붙여주기.
가령, nullable로 선언된 nullableSentence는 ?.length() 로 길이를 알 수 있다.
ㅣ가능한 코드
fun main () {
var nullableSentence : String? = null
nullableSentence?.length
}
출력하면 null이 출력된다.
4. ? :
?: 는 null이 아닌 값은 그대로 쓰고 null이면 : 의 우측 값을 넣는다.
가령, null인 nullSentence 에 ?: "notnull"을 하면 notnull이 출력된다.
fun main () {
var nullSentence : String? = null
var printedSentence = nullSentence ?: "It was in a null state"
println { printedSentence }
}
null일수도, 아닐수도 있었던 nullable type 변수인 nullSentence에 null이 들어갔고, printedSentence는 null인경우 :의 우측 값을 넣으므로 이를 출력하면 It was in a null state 가 출력된다.
5. !!
!!는 null 이 아님을 강조하는 것이며, 앞으로도 이전에도 계속 확실하게 null이 아닌 경우 사용할 수 있다. nullable 변수였음에도 !!를 통해 null 아닌 값만 들어간다는 것을 알았으므로 만일 해당 변수에 null이 들어가면 npe (null pointer exception) 이 발생하고 프로그램이 종료되면서 null이 할당되었다는 것을 알린다.