Kotlin에서 null이란?
null은 기본값이 정해지지 않은 상태를 의미한다.
실제로 변수를 생성하고 초기화를 하지 않는 경우,
자동으로 null 값이 할당된다.
값이 없는 상태인 null 로 지정되면 NullPointerException이
발생될 수 있기 때문에 null 처리는 중요하다.
Kotlin null 가능 타입 vs null 불가능 타입
코틀린에서 변수는 nullable(null 가능 타입)과
non-nullable(null 불가능)으로 나뉘게 된다.
non-null 타입 변수에 null 값을 할당하면
에러가 난다.
fun main(args: Array<String>) {
var nullTest = "testNull"
//Null cannot be a value of a non-null
nullTest = null
}
String? 은 명시적으로 null 값을 허용한다는 뜻이다.
readline() 함수 반환값을 String 혹은 null 값으로 반환
한다는 뜻이다.
main 함수에서 변수에 readline() 반환값을 저장하면
정상적으로 null 값이 출력된다.
fun main(args: Array<String>) {
var signature = readline()
println(signature)
}
public fun readline(): String?{
var text = null
return text
}
코틀린은 컴파일 기반 언어기 때문에, 컴파일을 할 때
컴파일러가 기초적인 에러요소들을 잡아준다. 코틀린
컴파일러는 null 가능 타입에 null이 들어있는지, null 불가능
타입에 null이 들어있지는 않은지 미리 확인해준다.
컴파일 에러와 반대로 런타임 에러는 프로그램이 문제없이
컴파일 되고 나서 프로그램 실행 중 발생하는 에러다. 자바는
null 가능과 불가능 타입을 구분하지 않기 때문에, 자바 컴파일
만으로는 NullPointerException 에러를 잡기가 어렵다.
Kotlin null 에러 예방하는 방법
1) 안전호출 연산자 사용하기
안전 호출 연산자(safe call operator)는 ?. 기호다.
해당 변수가 null 값을 받지 못한다는 것을 컴파일러에게
명시적으로 알려주는 것이다.
capitalize() 함수는 String 값을 대문자로 변경해주는 기능을
가진다. 안전 호출 연산자 "?."를 사용하면 null 값인 경우에는
호출되지 않고, 아닌 경우 호출이 된다.
fun main(args: Array<String>) {
var signature = readline()?.capitalize()
println(signature)
}
public fun readline(): String?{
var text = null
return text
}
2) let 함수 사용
let 함수를 통해서 null인경우와 아닌 경우를 구분하여
로직을 구성할 수 있다. 아래 예시에서는 null이 아닌
경우 let 함수가 호출되고 빈문자열이 아닌경우(isNotBlank() == true)
captialize() 함수가 호출된다.
fun main(args: Array<String>) {
var signature = readline()?.let{
if(it.isNotBlank()){
it.capitalize()
}else{
"테스트"
}
}
println(signature)
}
public fun readline(): String?{
var text = null
return text
}
3) non-null 단언 연산자 사용
non-null 단언 연산자(assertion operator) 연산자는 !! 다.
해당 값이 null이 될 수 없다는 것을 명시적으로 표시하는
장치다.
만약 해당 변수값이 null이면 런타임 시점에 NullPointerException을
발생시킨다.
fun main(args: Array<String>) {
var signature = readline()!!.capitalize()
println(signature)
}
public fun readline(): String?{
var text = null
return text
}
NullPointerException 출력 결과
Exception in thread "main" java.lang.NullPointerException
at TavernKt.main(Tavern.kt:2)
4) if~else 조건문 사용
가장 간단한 방법이다. if 문으로 해당 변수가
null인지 판단한 후 로직을 구성하는 것이다.
fun main(args: Array<String>) {
var signature = readline()
if(signature!=null) signature=signature.capitalize()
else println("signature은 null 값이다.")
println(signature)
}
public fun readline(): String?{
var text = null
return text
}
Kotlin Elvis Operator
null 복합 연산자다. 표기는 ?: 을 사용한다.
왼쪽 값이 null이면 오른쪽 값을 할당한다.
signature 변수에는 null을 반환하는 readline() 함수
반환값이 할당된다. elvisoperator 변수에 null 복합
연산자를 할당해서 만약 signature가 null 이면
"엘비스는 살아있다"를 출력한다.
fun main(args: Array<String>) {
var signature = readline()
var elvisoperator: String = signature ?: "엘비스는 살아있다"
println(elvisoperator)
}
public fun readline(): String?{
var text = null
return text
}
'Programming' 카테고리의 다른 글
자바 배열 선언 2차 배열 0으로 초기화 하는 방법 java.lang.NullPointerException (0) | 2022.03.22 |
---|---|
Kotlin kotlin-android-extentions가 제거된 안드로이드 4.1 XML 객체 선택하는 방법 (0) | 2022.03.09 |
Ubuntu NPM node.js install 설치하기 (0) | 2022.03.08 |
Kotlin when 문법 사용하는 방법 (0) | 2022.03.07 |
Kotlin 변수 상수 타입 지정하는 방법 코틀린에서 변수 내장타입은? (0) | 2022.03.07 |
Kotlin Hello World 출력하기 (0) | 2022.03.07 |
댓글