개발 공부 기록하기/01. JAVA & Kotlin

[코틀린] ?. 연산자, ?: 연산자

lannstark 2021. 1. 5. 22:05

코틀린에는 ?. 연산자가 존재한다.

일반적으로 객체지향적인 언어에서 . 연산자는 객체 인스턴스의 필드나 메소드에 접근하는 역할을 수행한다.

코틀린에서는 객체가 null 일 수도 있는 경우를 코드 상 명확히 하기 위해 . 대신 ?. 를 사용해야 한다.

Java와 Kotlin으로 몇 가지 예시를 살펴보자

Java 에서의 . 연산자

다음과 같은 코드가 있다고 해보자.

public void main() {
  System.out.println(getCarOrNull().getName());
}

public Car getCarOrNull() {
  if (...) {
    return null;
  }
  return new Car();
}

getCarOrNull 코드를 호출하면 조건에 따라 null이 올 수도 Car 인스턴스가 반환될 수도 있다. 이때 만약 null이 반환된다면 NPE를 당하게 된다.

이를 코틀린으로 바꿔보자

Kotlin에서의 .연산자

fun main() {
  print(getCarOrNull().name))
}

fun getCarOrNull(): Car {
  if (...) {
    return null
  }
  return new Car()
}

위의 코드는 에러가 나게 된다.

왜냐하면 getCarOrNull 에서 null을 반환할 수 있는데 함수 반환타입을 Car로 지정했기 때문이다.

fun main() {
  print(getCarOrNull().name))
}

fun getCarOrNull(): Car? {
  if (...) {
    return null
  }
  return new Car()
}

이번에도 에러가 나게 되는데 에러가 나는 지점은 getCarOrNull().name 이다. 해당 메소드에서 null이 나올 수 있기 때문에 단순히 . 를 사용하는게 언어단에서 막혀있다.

fun main() {
  print(getCarOrNull()?.name))
}

fun getCarOrNull(): Car? {
  if (...) {
    return null
  }
  return new Car()
}

이제 동작한다. 함수를 사용하는 쪽의 코드만 보고 null을 사용하는지 사용하지 않는지 확인할 수 있으며, getCarOrNull 에서 null이 나왔을 경우 getCarOrNull()?.name 값 자체가 null이 된다.

?: 연산자

엘비스 연산자라고 부르는 연산자인데, getCarOrNull()?.name 값 자체가 null이 된다는 결과와 합치면 코드를 깔끔하게 만들어줄 수 있다.

fun main() {
  print(getCarOrNull()?.name ?: "기본이름"))
}

fun getCarOrNull(): Car? {
  if (...) {
    return null
  }
  return new Car()
}

딱보면 삼항 연산자처럼 생긴게 역할도 비슷하다. 연산자 왼쪽의 결과가 null 이면 뒤의 값을 사용하게 된다.

이제 getCarOrNull() 에서 null을 반환하게 되면 "기본이름"을 출력할 것이다.

끝!