soft IT life
[Kotlin] ?: 과 ?=의 차이 본문
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이 지정되었다고 판단함)
'Errors' 카테고리의 다른 글
spring boot 빌드 & 컴파일 순서에 대해서 (0) | 2024.05.24 |
---|---|
kotlin+springboot 환경에서 @Valid 적용 되지 않는 이슈 (0) | 2024.04.09 |
Intellij 비정상 종료 시 프로세스가 살아 있는 이슈 (0) | 2024.01.17 |