[코틀린] ?. 연산자, ?: 연산자
코틀린에는 ?.
연산자가 존재한다.
일반적으로 객체지향적인 언어에서 .
연산자는 객체 인스턴스의 필드나 메소드에 접근하는 역할을 수행한다.
코틀린에서는 객체가 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을 반환하게 되면 "기본이름"을 출력할 것이다.
끝!