Kotlin에서 예외 처리 하기(Safe Call과 Elvis 연산자 활용)

김민우·2023년 4월 7일
1

kotlin

목록 보기
3/6
post-thumbnail

본 글은 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
을 보고 정리한 글입니다.

기존의 스프링 프로젝트를 진행하면서, null과 예외 처리를 할때 반복되거나 긴 코드를 사용하여 공간을 낭비하는 경우가 많았다.

Safe CallElvis 연산자를 통해 간단히 null을 처리해보자.😊


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

들어가기 앞서, 이 함수는 안전하지 않다. String은 Refernce type 이기 때문에 null을 수용할수 있고, str에 null이 들어오면 NPE가 나게 되기 때문이다.

다음 3가지 함수를 이용하여 NULL을 JAVA에서는 처리 가능하다.

  1. str이 null일 경우 Exception을 내기 (반환 타입은 boolean)
  2. str이 null일 경우 null을 반환하기 (반환 타입은 Boolean)
  3. str이 null일 경우 false를 반환하기 (반환 타입은 boolean)

일단 코틀린에서는 null이 가능한 타입을 완전히 다르게 취급한다.😊

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

str 뒤에 물음표(?) 연산자가 없어, null이 들어오지 않음을 보장해주므로, startsWith라는 함수를 불러올 수 있다.

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

하지만 위 함수는 불가능하다. str 뒤에 물음표(?) 연산자가 있어, str이 null이 들어올 수 있으므로, startsWith 함수를 바로 불러올수 없다!

null이 가능한 타입만을 위한 기능은 2가지가 있다.

1. Safe Call

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

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

str이 null이면 str?.length는 null이 반환된다!

2. Elvis 연산자

앞의 연산 결과가 null이면 뒤의 값을 사용

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

str이 null이면, 0을 반환해주는 연산자.


Safe Call과 Elvis 연산자를 활용해 예외처리를 해보자.

1. str이 null이 들어왔을 때 Exception을 반환하는 경우

fun startsWithA1(str: String?): Boolean {
    if (str == null) {
        throw IllegalArgumentException("null이 들어왔습니다.")
    }
    return str.startsWith("A")
}

변경 후 함수

fun startsWithA1S(str: String?): Boolean {
    return str?.startsWith("A")
        ?: throw IllegalArgumentException("null이 들어왔습니다.")
}

Safe Call과 Elvis 연산자를 활용하여 str이 null일 경우 IllegalArgumentException을 반환한다.

2. str이 null이 들어왔을 때, 단지 반환값으로 null을 반환하는 경우

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

변경 후 함수

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

Safe Call을 활용하여 str이 null일 경우 null을 반환한다. null을 가질 수 있도록 Boolean?을 이용함.

3. str이 null이 들어왔을 때, 단지 반환값으로 false을 반환하는 경우

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

변경 후 함수

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

Safe Call을 활용하여 str이 null일 경우 false 반환한다.


nullable 한 필드지만, 무조건 null이 아닐때 처리 방법

프로젝트를 진행하면서, 초기 필드가 nullable 하지만, 업데이트를 거쳐 null값이 무조건 아닌 필드가 있을 수 있다. 이 경우도 코틀린에서 처리 가능하다.

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

!! 연산자를 이용해, null이 아님을 보장한다.


느낀점
코틀린으로 간단한 토이 프로젝트를 진행할때, 예외 처리를 할경우 Elvis랑 safe call을 이용하자!😊

profile
Backend Developer

0개의 댓글