코틀린에는 ?.
연산자가 존재한다.
일반적으로 객체지향적인 언어에서 .
연산자는 객체 인스턴스의 필드나 메소드에 접근하는 역할을 수행한다.
코틀린에서는 객체가 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을 반환하게 되면 "기본이름"을 출력할 것이다.
끝!
'개발 공부 기록하기 > 01. JAVA & Kotlin' 카테고리의 다른 글
[코틀린 탐구생활] when, 그리고 클린 코드 (0) | 2021.01.20 |
---|---|
[코틀린] data class란? (0) | 2021.01.07 |
[코틀린] val과 var 차이 (0) | 2021.01.05 |
짧은 코멘트와 함께하는 이펙티브 자바) #20 추상 클래스보다는 인터페이스를 우선하라 (0) | 2020.11.10 |
짧은 코멘트와 함께하는 이펙티브 자바) #19 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2020.10.19 |