[Kotlin] Null 다루기

백마금편·2022년 7월 15일
0

Kotlin

목록 보기
2/5
post-thumbnail
post-custom-banner

Kotlin Playground

Kotlin Playground
Kotlin Playground


Null Check

public boolean startsWithA(String str) {
	// "A"로 시작하면 true, 아니면 false 반환
	return str.startWithA("A");
}

위 소스는 str이 null이 들어갈 수 있으므로 안전하지 않다.

예외처리

Java 예외처리

public boolean startsWithA1(String str) {
	if (null == str) {
    	throw new IllegalArgumentException("str is null")
    }
    return str.startsWith("A");
}

Kotlin 예외처리

fun startsWithA1(str: String?): Boolean {
	if (null == str) {
    	throw IllegalArgumentException("str is null")
    }
    return str.startsWith("A")
}

return null

Java return null

public boolean startsWithA2(String str) {
	if (null == str) {
    	return null;
    }
    return str.startsWith("A");
}

Kotlin return null

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

fun startsWithA(str: String?) Boolean? 처럼 return type 에 ?을 붙여주면 return null 가능하다.

return false

Java return false

public boolean startsWithA3(String str) {
	if (null == str) {
    	return false;
    }
    return str.startsWith("A");
}

Kotlin return false

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

Safe Call, Elvis 연산자

Safe Call

null이면 그대로 null 반환, null이 아니면 실행

val str1: String? = "ABC"
str.length // 불가능
str?.length // return 3

val str2: String? = null
str.length	// 불가능
str?.length // return null

Elvis 연산자

null이 아니면 실행, null이면 ?: 뒤에 값 return

val str1: String? = null
str?.length ?: 10 // return 10

startsWithA Refactoring

fun startsWithA1(str: String?): Boolean {
    return str.startsWith("A") ?: throw IllegalArgumentException("str is null")
}

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

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

kotlin early return

fun calculate(number: Long?): Long {
	number ?: return 0
}

kotlin early return

fun calculate(number: Long?): Long {
	number ?: return 0
}

Null 아님 단언

nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우 호출 시!!을 붙인다.
parameter로 null이 들어올시 NullPointerException이 발생한다.

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

정리

null이 들어갈 수 있는 Type은 완전히 다르게 간주된다.
null이 아닌 경우에만 호출되는 Safe Call(e. g. str?.length)이 있다.
null인 경우에만 호출되는 Elvis 연산자(e. g. str?.length ?: 0)이 있다.

profile
뭐 어떻게 잘 되겠지
post-custom-banner

0개의 댓글