Kotlin_Android 앱 개발/코틀린 익히기

02. null,래핑,언래핑, 그리고 엘비스 연산자

하다블 2024. 1. 6. 20:27
반응형

안녕하세요. 하다블입니다.

이번에는 null과 엘비스 연산자에 대해 기록해보고자 합니다.

저의 첫 언어는 C언어였고 이후 C++을 통해 객체지향프로그래밍, 자료구조 등을 공부하였습니다. 그러다 보니 null과 pointer에 대한 골치아픔을 자주 겪었습니다. 하지만 Kotlin은 Java와 달리 NPE(Null Pointer Exception)을 제거하기 위해 기본적으로 변수에 null을 선언할 수 없다는 점이 신기하고 흥미롭게 다가왔습니다.

null을 아예 쓸 수 없는 것은 아닙니다. 방식은 다음과 같습니다.

var tmp:String = null //변수에 null을 기본적으로 사용할 수 없으므로 Error
var tmp2:String? =null//변수 Type에 ?를 넣어 Nullable 변수로 선언, 컴파일 성공

다음과 같이 자료형에?를 넣는 방법은 널 허용 자료형이라고 합니다. 이때에는 null을 넣을 수 있으며 정수형(Int) 역시 널 허용 자료형으로 가능합니다. 널 허용 자료형을 선언하는 과정을 래핑(Wrapping)이라고 부르기도 합니다.

래핑을 했다면, 반대로 언래핑(Unwrapping)이라는 과정도 존재합니다. 이 과정의 경우에는 널 허용 자료형을 일반 자료형으로 처리하는 과정을 말합니다. 사용할 때에는 느낌표 2개를 붙여 사용합니다.

var name:String? // name이라는 널 허용 자료형을 생성
name!! //name을 널 허용 자료형에서 기존의 자료형으로 변경

원래핑이 필요한 경우에는 역시 널 허용 자료형을 그대로 사용할 수 없는 경우입니다. 위 상황을 그대로 예시로 사용해 보겠습니다.

var name:String?

/*

	수 많은 코드들...
    
 */
 var nameLength=name.length // null 허용 자료형의 길이를 측정할 수 없으므로 Error
 var nameLength1=name!!.length //기존의 자료형으로 변환하였으므로 실행 가능한 코드

다음과 같이 null이 들어갈 수 있는 자료형의 길이를 변수로 가지는 변수가 있다면 에러가 발생할 수 있어 작동하지 않지만 언래핑을 통해 기존의 자료형이 되면 코드를 사용할 수 있게 됩니다. 

하지만 언래핑을 마구잡이로 사용할 수는 없습니다. 언래핑의 경우, null의 값을 가지지 않는 것이 확실할 때 사용하기 때문입니다. 만약 계속 null의 값을 가지고 있는 상황에서 언래핑을 하게 되면 에러가 발생하게 됩니다.

그래서 안전한 호출 방식을 사용해서 사용하기도 합니다. 방법은 다음과 같습니다.

var name:String?=null

val nameLen = name?.length

다음과 같이 변수이름 뒤에?를 붙이게 되면 null이 아닌 경우에만 실행되게 됩니다. 이 방법을 통해 null로 인한 에러를 막을 수 있습니다. 하지만 null인 경우 실행이 되지 않기 때문에 이후 코드에 영향을 줄 수도 있습니다.

이를 방지하기 위한 다른 방법이 바로 엘비스 연산자입니다.

C++을 하신 분들이라면 익숙하게 사용했을 삼항 연산자와 비슷하게 생겼습니다. 물음표 기호를 사용한다는 점도 있지만 삼항 연산자와 비슷하게 작동하지 않았을 때를 정의한다는 점이 비슷하게 다가왔습니다.

사용방법은 다음과 같습니다.

    val name1:String?="HaDaBle"
    var Friend:String?=null
    val nameLen:Int = name1?.length?:-1 //HaDaBle이므로 7의 값을 가진다.
    var FriendLen:Int = Friend?.length?:-1//null이므로 엘비스 연산자 뒤에 있는 -1의 값을 가진다.

 

?라는 기호가 자료형에도 붙고 변수이름에도 붙고 하다 보니 헷갈릴 수 있을 것 같습니다. 그리고 NPE을 제거하기 위한 코틀린의 체계에도 한 번 더 감탄하게 됩니다. 다음에도 기록해야 할 부분이 있으면 기록하도록 하겠습니다.

더 노력하는 사람이 되겠습니다. 감사합니다.

반응형