soft IT life

[Kotlin] ?: 과 ?=의 차이 본문

Errors

[Kotlin] ?: 과 ?=의 차이

softPattern 2024. 9. 24. 16:22

kotlin은 null safety 언어이기 때문에 null을 핸들링 할 수 있도록 여러 키워드가 있다.

그중에는 ?: ?=가 있는데 이 둘의 차이를 정확히 이해하지 못해 애먹은 경험을 바탕으로 이슈를 정리해본다.

 

?:

엘비스연산자.

null 값이 들어오는 경우에 null safe한 연산을 위해 사용됨.

왼쪽 값이 null일 경우에 오른쪽 값을 반환, 할당한다.

 

예시

fun write(name:String?){
	val myName = name ?: "KimYang" 
}

nullable한 name이 넘어왔다. 따라서 Null이 넘어올 수도 있다.

이런 경우를 대비해서 만약 name에 null이 넘어오는 경우 ?: 오른쪽 값을 할당하여 주는 것이다.

 

 

?=

왼쪽 프로퍼티나 매개변수에 아무런 값이 전달되지 않는 경우에 오른쪽에 명시한 기본값을 할당한다.

1번 예시
fun write(name : String ?= "KimYang"){
	val myNmae = name
    print(myName) -> "KimYang" 출력
}

2번 예시
data class Profile(
	val name : String ?= "KimYang"
)
val profile = Profile()
print(profile.name) -> "KimYang" 출력

 

그렇다면 아래와 같은 예시는 가능할까 ???

data class Profile(
	val name : String ?= "Kim"
)

fun write(name : String ?= null) {  -> 매개변수로 아무런 값도 넘어오지 않음
	val profile = Profile(
    	name 
    )
    
    print(profile.name) -> ???
}

매개변수로 아무 값도 넘어오지 않았으니 name에는 null이 할당되고 그 상태에서 Profile 객체를 생성했다. 

print(profile.name)하면 어떤 값이 출력될까 ?

"Kim" 이 출력될까 ? 

그렇지 않다...  

NULL이 출력된다.  그 이유는 무엇일까 ?

 

Kotlin은 null 또한 하나의 값으로 인식한다.

따라서 ?= 키워드가 적용되지 않고 저장된 null값이 print 된다.

왜냐하면 ?= 키워드는 해당 매개변수나 프로퍼티가 아무것도 지정되지 않은 경우에 후자의 값을 할당하는 것이기 때문이다. (null이 지정되었다고 판단함)