[Kotlin] null을 다루는 방법

모지리 개발자·2022년 11월 15일
1

Kotlin

목록 보기
2/5

이 글은 인프런의 자바 개발자를 위한 코틀린 입문의 영상을 보고 공부하면서 정리하는 글입니다.

목차

1. Kotlin에서의 null 체크

2. Safe Call과 Elvis 연산자

3. null 아님 단언!!

4. 플랫폼 타입


1. Kotlin에서의 null 체크

자바의 코드 먼저 확인해보겠습니다. 아래의 코드는 안전한 코드일까요?
java

public boolean startWithA(String str){
	return str.startsWith("A");
}

String 변수에 null이 들어올 수도 있기 때문에 안전하지 않습니다.
만약 위의 코드의 str변수에 null이 들어오게 된다면 NPE가 발생하게 됩니다.

위의 문제를 해결하기 위해서 자바에서는 다음과 같이 고칠 수 있을 것 입니다.

  1. str이 Null일 경우 Exception을 낸다.

java

public boolean startWithA1(String str){
	if (str == null){
    	throw new IllegalArgumentException("null이 들어왔습니다.")
    }
	return str.startsWith("A");
}
  1. null일 경우 그대로 null을 반환합니다. (return 값에 null이 들어갈 수 있는 경우)
    java
public Boolean startWithA2(String str){
	if (str == null){
    	return null;
    }
	return str.startsWith("A");
}
  1. str이 null일 경우 false를 반환합니다.
    java
public boolean startWithA3(String str){
	if (str == null){
    	return false;
    }
	return str.startsWith("A");
}

위의 3가지 방법을 코틀린으로 변경해보겠습니다.

  1. str이 Null일 경우 Exception을 낸다.

Kotlin

fun startsWithA1(str: String?): Boolean{
	if(str == null){
    	throw IllegalArgumentException("null이 들어왔습니다")
    }
    return str.startsWith("A")
}
  1. null일 경우 그대로 null을 반환합니다. (return 값에 null이 들어갈 수 있는 경우)

Kotlin

fun startsWithA2(str: String?): Boolean?{
	if(str == null){
    	return null
    }
    return str.startsWith("A")
}
  1. str이 null일 경우 false를 반환합니다.

Kotlin

fun startsWithA3(str: String?): Boolean{
	if(str == null){
    	return false
    }
    return str.startsWith("A")
}

코틀린에서는 null이 가능한 타입을 완전히 다르게 취급합니다!

2. Safe Call과 Elvis 연산자

위에서 언급 드린 것처럼 코틀린에서는 null이 가능한 타입을 완전히 다르게 취급합니다.

그렇다면 Null이 가능한 타입만을 위한 기능은 없을까요?

  1. Safe Call

Kotlin

val str: String? = "ABC"
str.length // 불가능
str?.length // 가능!!

null이 아니면 실행하고, null이면 실행하지 않습니다.(그대로 null)

  1. Elvis 연산자

Kotlin

val str: String? = "ABC"
str?.length ?: 0

앞의 연산결과가 null이면 뒤의 값을 사용합니다.(그대로 null)

3. null 아님 단언!!

nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우들이 있습니다.

Kotlin

fun startsWithA1(str: String?): Boolean {
	return str!!.startsWith("A")
}

그래도 혹시나 null이 들어오게 되면 NPE가 발생하기 때문에 정말 null이 아닌게 확실한 경우에만 null아님 단언 !!을 사용해야합니다.(그대로 null)

4. 플랫폼 타입

플랫폼 타입이란 코틀린이 Null 관련 정보를 알 수 없는 타입입니다.
Runtime시 Exception이 발생할 수 있습니다.

이번강의로 알게 된 것

  • 코틀린에서 Null이 들어갈 수 있는 타입은 완전히 다르게 간주됩니다.
    - 한번 null검사를 하면 non-null임을 컴파일러가 알 수 있습니다.
  • null이 아닌 경우에만 호출되는 Safe Call(?.)이 있습니다.
  • null인 경우에만 호출되는 Elvis연산자(?:)가 있습니다.
  • null이 절대 아닐 때 사용할 수 있는 널 아님 단언 (!!) 이 있습니다.
  • 코틀린에서 자바 코드를 사용할 때에는 플랫폼 타입 사용에 유의해야합니다.
    - 자바 코드를 읽으며 널 가능성 확인 / 코틀린으로 wrapping
profile
항상 부족하다 생각하며 발전하겠습니다.

0개의 댓글