본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 38] 안전한 호출과 엘비스 연산자

null 가능성을 편리하게 처리할 수 있는 다양한 연산자

 

 

오늘 학습할 아톰은 지난 아톰에서 null일 경우 역참조가 불가능하다는 부분에 대해서 처리할 수 있는 연산자에 대한 아톰으로 추정된다.

과연 어떻게 처리를 했을지 알아보도록 하자.


 

[ 안전한 호출 ]

 

안전한 호출

: 일반 호출에 사용하는 점(.)을 물음표와 점(?.)으로 표현한 연산자

: null이 될 수 있는 타입의 멤버에 접근하면서 예외가 발생하지 않도록 함

: 객체가 null이 아닐 때에만 연산을 수행하며, null일 경우 null을 결과로 출력

: if를 통해 null을 처리하는 것 대신 사용하여 더 간략하게 표현 가능

: 안전한 호출을 사용해 여러 멤버에 접근을 연쇄시키는 경우 중간에 null이 나온다면 결과로 null을 출력

 

import atomictest.eq

fun checkLength(s: String?, expected: Int?) {
	val lengthl =
		if (s != null) s.length else null // null 처리를 위한 if문
	val length2 = s?.length // 안전한 호출을 이용한 null 처리
    length1 eq expected
    length2 eq expected
)

fun main() {
	checkLength("abc", 3)
    checkLength(null, null)
}

 

 


 

[ 엘비스 연산자 ]

 

엘비스 연산자

: ?. 결과로 null일 때 null 이상의 일이 필요한 경우 사용

: 물음표 뒤에 콜론(?:)을 붙인 연산자

: ?: 왼쪽 식이 null이 아니라면 왼쪽 식이 값으로, null이라면 오른쪽 식이 값으로 출력

 

import atomictest.eq

fun checkLength(s: String?, expected: Int) {
	val lengthl =
		if (s != null) s.length else 0 // if-else를 통해 null 여부에 따른 결과 출력 
    val length2 = s?.length ?: 0 // 엘비스 연산자 사용
    
    length1 eq expected
	length2 eq expected
}

fun main() {
	val s1: String? = "abc"
    (s1 ?: "一") eq "abc"
    
    val s2: String? = null
    (s2 ?: "—") eq "—"
    
    checkLength("abc", 3)
    checkLength(null, 0)
)

 


 

[ 오늘의 학습 소감 ]

 

오늘은 이전 아톰에서 null일 경우 참조를 위해 if문으로 null이 되는 경우를 차단하여 참조하는 방식을 보았는데, 오늘 아톰에서는 안전한 호출을 통해 이를 간단하게 표현할 수 있는 방법에 대해서 보았다. 또한 if-else 대신에 사용할 수 있는 엘비스 연산자도 학습하였는데, null이 중요하고 자주 다루는 만큼 오늘의 아톰 내용은 반드시 알아 두어야 겠다는 생각이 들었다. 또한, 위의 블로깅에서 언급하지는 않았지만, 널 아닌 단언(!!.) 호출도 있는데 이는 다음 아톰에서 설명하는 것으로 보이기에 다음 아톰시간에 어떻게 사용되는지 학습할 예정이다. 40 아톰까지 null에 대해 다루는 만큼 확실하게 알아두면 좋을 것 같다.