환경 : Kotlin Version = 1.5.20, Java version = 14.0.2 JVM, Android Studio
코틀린의 null 처리 방식을 알아보자
0.참고 자료
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/
https://www.boostcourse.org/mo132
1. 코틀린의 null
대부분의 언어는 null인 상태와 non-null인 상태를 고려하지 않기 때문에 대부분의 변수가 null을 허용하지 않는다.
우리의 코틀린도 변수 선언은 기본적으로 null을 허용하지 않는다.
하지만 자료형 뒤에 ?기호를 붙이면 null이 가능한 변수를 선언을 할 수 있다.
val a : Int = 30 //null을 허용하지 않는다.
val b : Int? = null //null을 허용한다.
위의 변수 a는 non-null 변수이고 변수 b는 nullable 변수로 엄연히 다른 자료형이다.
하지만 이것만으로 null을 안전하게 사용한다고 할 수 없다.
non-null과 nullable을 분리해놨지만, nullable을 사용할 일이 분명 있기 때문에,
NPE(NullPointException)을 피할 순 없다.
이를 위해 코틀린에선 nullable한 변수를 더 안전하게 사용하기 위한 다음과 같은 기능을 제공한다.
1) 세이프콜(?.)
?.(세이프콜) : 앞의 변수가 null일 시 뒤의 length를 실행하지 않고 null을 반환한다.
//세이프콜을 사용하지 않으면 컴파일에러 발생
var str1 : String?
str1 =null
println("str1.length = ${str1?.length}") //result : null
2) non-null 단정 기호(!!)
!!(non-null 단정 기호) : 앞의 변수가 널이 아닐꺼라고 단정한다.
// !!사용시 컴파일 에러는 발생하지 않으나 npe 런타임에러 발생
반드시 널이 아니라는게 보장될 때만 사용하고 되도록 사용하지 않는 것이 좋다.
var str1 : String?
str1 =null
println("str1.length =${str1!!.length}") //npe발생
3) 엘비스 연산자(?:)
if 조건문으로 자동 형 변환을 통해 str이 null이 아님이 확인되면 str은 non-null상태가 되며, str.length를 사용할 수 있다.
위의 if 조건문을 활용한 식을 세이프콜과 ?:엘비스 연산자를 사용해 간결하게 변환할 수 있다.
//str1?.length가 null이면 -1을 반환 null이 아니면 str1.length를 반환
val len = if(str !=null) str1.length else -1
val len = str1?.length ?: -1
//str1?.length가 null이면 -1을 반환 null이 아니면 str1.length를 반환
2. Q&A
1) 왜 null을 왜 최대한 피해야 할까?
- 사용할 수 없는 null인 변수에 접근하면 npe를 발생시키기 때문이다.
2) val 선언처럼 변경 불가능한(immutable)변수를 적극 활용하는 이유는 뭘까?
- 변경하면 안되는 변수를 실수로 변경할 수 있기 때문이다.
- 본질적으로 함수형 프로그래밍은 스레드 안전(thread-safe)이고, 불변성은 스레드를 안전하게 만드는 데 큰 역할을 한다. 코틀린은 함수형 프로그래밍과 객체지향 프로그래밍(OOP) 언어의 조화가 이루어진 언어이므로 불변성을 권유한다.
'언어 > Kotlin&Java' 카테고리의 다른 글
[코틀린/Kotlin] 기초 #07_코틀린의 연산자 (0) | 2021.08.17 |
---|---|
[코틀린/Kotlin] 기초 #06_자료형 변환과 스마트 캐스트 (0) | 2021.08.15 |
[Kotlin/Java] Android Studio에서 테스트 환경 구축하기_2 (0) | 2021.08.13 |
[Kotlin/Java] Android Studio에서 테스트 환경 구축하기_1(수정) (0) | 2021.08.12 |
[코틀린/Kotlin] 기초 #04_기본형 vs 참조형 (0) | 2021.08.10 |
댓글