본문 바로가기
언어/Kotlin&Java

[코틀린/Kotlin] 기초 #05_ 안전한 null 처리

by 옹구스투스 2021. 8. 14.
반응형

환경 : Kotlin Version = 1.5.20, Java version = 14.0.2 JVM, Android Studio

 

코틀린의 null 처리 방식을 알아보자


0.참고 자료

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/

 

kotlin.io - Kotlin Programming Language

 

kotlinlang.org

https://www.boostcourse.org/mo132

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org


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) 언어의 조화가 이루어진 언어이므로 불변성을 권유한다.
반응형

댓글