이번 포스팅에서는 널이 무엇이고, 이를 다루는 법과 마지막으로 왜 중요한지에 대해 소개한다.
Null은 무엇일까.
Null은 아무런 값도 가지지 않는 상태이다.
즉, 존재하지 않으며, 할당된 값이 없는 상태이다.
그렇다고 0과는 다르다. 0은 엄연한 정수이며, int범위에 포함되지만 null은 값이 없는 상태이다.
쉽게 이해하기 위하여 비유를 들어보자.
0은 두루마리 휴지를 다 쓰고 심지만 남은 상태이며, null은 두루마리 휴지 자체가 없는 상태이다.
코틀린에서는 Nullable, Non-Nullable 두 가지 유형이 있다.
Nullable 타입은 변수에 null이 아닌 값은 물론이고 null값도 표현할 수 있다.
반면, Non-Nullable 타입은 null이 아닌 값만 표현할 수 있다. 즉, null값은 표현할 수 없다.
그렇다면 코틀린에서는 null값을 어떻게 표현할까.
// null 표현
var number : Int? = null
var str: String? = "Hello, world!"
변수의 자료명 뒤에 '?'을 붙여 나타낸다. 이는 null값을 가질 수도 있고, 안 가질 수도 있다는 의미이다.
문자열형 변수 str은 null을 가질수도 있는 '?'을 붙이지만 'Hello, World!'를 할당하였다.
이와 같이 '?'를 붙이고 꼭 null을 할당하지 않아도 된다.
null값 처리
Null은 프로그래밍에서 중요한 개념이지만, 제대로 처리되지 않으면 오류과 버그의 원인이 될 수 있다.
그 대표적인 예가 'NullPointerException'인데, 이는 null값이 허용되지 않는 변수나 객체에 null을 할당할 때, null객체를 참조할 발생 한다.
이를 방지하기 위해서는 null값을 올바르게 처리하는 것이 중요하다.
지금부터 null값을 처리하는 두가지 연산자인 Safe Call 연산자 (?.)와 Elvis 연산자 (?:)를 배워보자.
① Safe Call(?.) 연산자
Safe Call 연산자는 변수가 null인 경우, null을 반환하고, null이 아니라면, 속성 또는 메소드를 호출한다.
즉, Null일 수 있는 객체의 속성과 메서드에 안전하게 접근할 수 있다.
이는 NullPointerException를 방지할 수 있다.
Safe Call 연산자를 사용하기 위해 '?' 연산자를 자료형 뒤에 붙인다.
이 Safe Call의 가장 큰 특징은 개체 참조가 null이면 전체 식이 null로 평가된다는 것이다.
이 뜻을 이해하기 위해 코드를 봐보자.
// Safe Call 연산자
val str: String? = null
val length = str?.length
null이 가능한 문자열 변수 str을 선언하고 null값을 할당한다.
그 다음 Safe Call 연산자를 사용하여 length 값에 접근한다.
str이 null이므로 str? 표현식을 사용한다.
length도 null로 평가되며 length에는 null값이 할당된다.
② Elvis(?:) 연산자
null값을 처리하는 또 다른 방법은 Elvis 연산자를 사용하는 것이다.
Elvis 연산자는 '?:'를 사용하며, 식이 null인 경우 기본값을 제공한다.
아래 코드를 보자.
// Elvis 연산자
val str: String? = null
val length = str?.length ?: 0
null이 가능한 문자열 변수 str을 선언하고, null값을 할당한다.
그 후, Safe Call 연산자(?.)를 사용하여 length에 접근한다.
str이 null이므로 length도 null임을 앞서 배웠다.
하지만, Elvis 연산자(?:)를 사용하여 null인 경우, 기본값 0을 제공한다.
따라서 변수 length에는 값 0이 할당된다.
Null은 필요 없는거 아니야?
Null을 제대로 다루지 않으면 프로그래밍 오류가 발생한다고 하였다.
그렇다면 Null이 굳이 필요할까란 의문이 들 수 있다.
하지만, 경우에 따라 Null 값을 활용하면 다양한 표현을 할 수 있다.
예를 들자면, 데이터베이스에서 값을 가져올 때가 있다.
데이터베이스에서 값을 가져올 때 항상 필드에 값이 있는 것은 아니다. 사용자가 선택 옵션으로 데이터를 입력하지 않았을 수도 있다.
이 경우, Null을 사용한다면 사용자가 값을 제공하지 않았음을 나타낼 수 있다.
이 외에도 값과 더불어 상태를 나타낼 수도 있다.
'Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 조건문 if-else 와 when 사용법 파헤치기 (0) | 2023.05.03 |
---|---|
[Kotlin] 코틀린 메소드 (Method) 선언하기 : 메소드 정의, 함수의 타입, 매개변수, 반환값 정의 방법 (0) | 2023.05.02 |
[Kotlin] 코틀린 연산자 (Operators)와 우선순위 (2) | 2023.04.08 |
[Kotlin] 코틀린 기본 자료형(Primitive type)과 참조 자료형(Reference type) (2) | 2023.04.05 |
[Kotlin] 코틀린 변수 선언과 네이밍 (feat. property) (0) | 2023.04.03 |