Welcome! Everything is fine.

[Kotlin] 2강. 코틀린에서 null을 다루는 방법 본문

Kotlin

[Kotlin] 2강. 코틀린에서 null을 다루는 방법

개발곰발 2023. 11. 28.
728x90

* 인프런 강의 - 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)을 듣고 정리한 내용입니다.

 

🔗1강 내용

 

[Kotlin] 1강. 코틀린에서 변수를 다루는 방법

* 인프런 강의 - 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)을 듣고 정리한 내용입니다. 1강. 코틀린에서 변수를 다루는 방법 우테코가 끝나고 코틀린에 대한 공부가 필요하다고 느꼈

3uomlkh.tistory.com

2강. 코틀린에서 null을 다루는 방법

Kotlin에서의 null 체크

코틀린에서는 타입에 ? 를 붙여 null이 들어올 수 있음을 명시해줘야한다. 아래 예시를 보면, 자바에서는 String이었던 타입을 코틀린에서는 String?으로 바꿔서 쓴다.

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

 

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

Safe Call과 Elvis 연산자

코틀린에서는 null이 가능한 타입만을 위한 기능이 있다. 바로 Safe Call과 Elvis 연산자!

Safe Call은 다음과 같이 null이 아닐 경우에만 호출하고, null이면 그냥 전체가 null이 된다.

val str: String? = "안녕"
str.lenth // 불가능
str?.length // 가능

Elvis 연산자는 Safe Call과 함께 사용되는 기능으로, 앞의 연산 결과가 null이면 뒤의 값을 사용한다.

val str: String? = "안녕"
str?.length ?: 0 // str?.length가 null이면 0을 사용

 

이렇게 Safe Call과 Elvis 연산자를 사용해서 맨 위에 짰던 코드를 더 코틀린스럽게 수정할 수 있다.

아래 코드를보면 좀 더 간결하게 바뀌었는데, str.startsWith("A")가 null이라면 예외를 던지는 코드로 그 기능은 똑같다.

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

널 아님 단언

어떠한 상황에도 null일 수 없다고 판단되는 경우에는 !! 를 이용해 절대 null이 아님을 명시해준다.

그런데 만약 null이 들어오면 NPE가 나오기 때문에 정말 null이 아닌 경우에만 사용해야 한다.

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

플랫폼 타입

코틀린이 자바와 100% 호환가능한 언어라서 한 프로젝트 내에서 병행해서 쓰는 경우도 있다. 그럴 때 어떻게 처리될까?

코틀린은 null에 대한 Annotation 정보(@Nullable이나 @NotNull..)를 이해할 수 있기 때문에 nullable인지 non-nullable인지 알 수 있다.

그러나, 이런 annotation이 없다면? 코틀린은 null 관련 정보를 알 수 없다.

이런 타입을 플랫폼 타입이라고한다. 이런 플랫폼 타입은 런타임 시 Exception이 날 수 있다.

따라서 코틀린에서 자바 코드를 사용할 때는..

  • annotaion을 이용해 null 관련 정보를 꼼꼼히 작성하기
  • 라이브러리를 사용할 경우, 해당 라이브러리를 열어 null이 들어갈 수 있는지 체크하기
  • 최초에 코틀린에서 자바 라이브러리를 가져다 쓴 지점 랩핑하여 사용하기

여기서 랩핑하여 단일 지점을 만들라는 것이 어떤 의미인지 잘 이해가 가지 않았는데,

인프런 질문하기에 어떤 분이 같은 질문을 올려놓았다.

그리고 선생님께서 그에 대한 답변도 아주 잘 정리해 올려주셔서 찾아보면 바로 이해될 것이다!