CS/Kotlin

null safety - "?" 문법

졔졔311 2025. 1. 8. 09:53
728x90
반응형

kotlin에서의 null-safety

kotlin에서는 null-safety를 위해 ?를 사용한 문법을 사용한다.

 

?는 기본적으로 변수나 객체가 null을 허용할 수 있음을 나타낸다.

kotlin은 null-pointer exception을 예방하기 위해 null이 허용되는 타입과 허용되지 않는 타입을 구분하는데, 그 상황에 쓰일 수 있다.

?를 붙이면 해당 타입의 변수가 null을 가질 수 있음을,

붙이지 않으면 null을 할당할 수 없음을 나타낸다.

예를 들면, 다음과 같다.

var nullableString: String? = null  // null 값을 허용
var nonNullableString: String = "Hello"  // null 값 허용하지 않음

nullableString = "Hi"  // 가능
nonNullableString = null  // 컴파일 오류 발생

 

? operator의 종류

?를 붙여 나타낼 수 있는 연산자에는 safe call(?.), elvis operator(?:), non-null assertion(!!)이 있다.

 

ㅇ safe call ?.

안전하게 호출하기 위해 사용하는 연산자

객체가 null이면 호출을 무시하고 null을 반환하도록 한다.

val nullableString: String? = null
println(nullableString?.length)  // 길이 대신 null 반환 (예외 발생x)

 

ㅇ elvis operator ?:

null이면 기본값을 제공하는 연산자

"a ?: b" 와 같이 사용할 수 있다.

만약 a가 널이면 b를 반환한다.

val nullableString: String? = null
val length = nullableString?.length ?: 0  // nullableString이 null이면 0 반환
println(length)  // null이므로 0 출력

여기서 a의 역할은 nullableString?.length가 하고 있고, b의 역할은 0이 하고 있다.

(nullableString?.length) ?: (0)의 형태인 것

nullableString은 현재 null을 가지고 있으므로, elvis operator에 의해 기본값인 0을 리턴한다.

따라서 length는 0

ㅇ non-null assertion !!

강제로 null이 아님을 명시하는 연산자

변수나 객체가 null일 경우, 런타임에 NullPointerException이 발생한다.

val nullableString: String? = null
println(nullableString!!.length)  // 런타임에서 NullPointerException 발생

런타임에 exception이 발생하기 때문에 가능한 사용을 피하는 것을 권고한다.

 

 

728x90
반응형