[Kotlin] 코틀린의 null 처리(null 안전성)

Jinny·2021년 1월 19일
0

Kotlin

목록 보기
3/9
post-thumbnail

🚩 Null 허용

코틀린은 변수에 null을 허용하지 않아 NPE(NullPointerException / 널 포인터 예외)를 예방할 수 있다.

여러 개발자들이 코틀린을 'NPE에서 자유로운 언어' 라고 칭한다.

하지만 변수에 null을 허용하는 방법이 있다.
바로! 자료형 뒤에 ?(물음표)를 붙이는 방법이다.

var a : String = "NPE Test"
a = null // 컴파일 에러

위와 같은 코드의 경우 a에 null을 대입하면 컴파일 에러가 난다.

실행결과 ↓

자료형인 String 뒤에 ?를 붙이면 null 이 허용된다.

var b : String? = "NPE Test"
b = null //OK
println("b : $b") //b의 값을 출력
실행결과 ↓

정상적으로 b의 값인 null이 출력되는 것을 확인할 수 있다.

🚩 Null 허용 변수 검사/사용하기

Null이 허용된 변수를 검사하고, 사용할 수 있는 방법들이 있다.

◾ 조건문을 통한 검사하기

val l = if (b != null) b.length else -1

간단히 b가 null 상태인지를 체크하는 방식이다.

◾ 세이프콜(?.) 사용하기

val b : String? = null
println(b?.length) 
실행결과 → b가 null이니 length에 접근하지 않고 null을 출력한다.

◾ 엘비스 연산자(?:) 사용하기

엘비스 연산자는 변수의 null여부를 확인한다.
null이라면 왼쪽, null이 아니라면 오른쪽 식을 실행한다.

var b : String? = null
val l = b?.length ?: -1
print("길이 : $l")
실행결과 → 길이 : -1

null인 경우 오른쪽 값 -1을, null이 아닌 경우 왼쪽 식 b?.length를 실행하라는 코드이다.
먼저 세이프콜이 사용된 b?.length 를 실행되는데 b?.length의 결과는 null이다. (위에 설명 있음!)

따라서 오른쪽 값인 -1이 변수 l에 저장된다.

◾ non-null(!!) 단정기호 사용하기

non-null(!!)의 경우 "얘는 null이 아니야!"라고 단정하는 것이다.

val b : String? = null
println(b!!.length) 
실행결과 : NPE(NullPointerException) 발생

컴파일러는 null이 아니라고 생각하여 null검사를 통과시켜 컴파일은 잘 진행이 된다.
하지만 프로그램을 실행하면 NPE가 발생하게 된다.


출처 : 코틀린 공식문서
profile
신입 개발자👩‍💻

0개의 댓글