[kotlin] 널 안전성을 갖는 코드 작성 방법

널 안전성은 Kotlin의 강력한 기능 중 하나입니다. 이를 통해 프로그래머는 런타임 중 발생할 수 있는 널 포인터 예외를 줄일 수 있습니다. Kotlin에서는 변수가 널인지 아닌지 명시적으로 표시하여 안전하게 사용할 수 있습니다.

1. 널 가능성 표시하기

변수가 널이 될 수 있는지 여부를 명시하기 위해서는 변수의 타입 이름에 물음표(?)를 붙입니다.

예를 들어, String 타입의 변수가 널이 될 수 있는 경우 다음과 같이 선언합니다.

var nullableString: String? = null

2. 안전한 호출 연산자(?.)

변수가 널이 아닌 경우에만 메서드를 호출하거나 속성을 접근하고 싶을 때는 안전한 호출 연산자(?.)를 사용합니다.

예를 들어, nullableString이 널이 아닌 경우에만 길이를 출력할 수 있습니다.

println(nullableString?.length)

3. 엘비스 연산자(?:)

널인 경우 기본값을 사용하고 싶을 때는 엘비스 연산자(?:)를 활용할 수 있습니다.

val length = nullableString?.length ?: 0

4. 널 검사

null 여부를 검사하려면 if 문이나 when 식을 사용할 수 있습니다.

if (nullableString != null) {
    println("String length: ${nullableString.length}")
} else {
    println("String is null")
}
when(nullableString) {
    null -> println("String is null")
    else -> println("String length: ${nullableString.length}")
}

5. 안전한 캐스트 연산자(as?)

널이 될 수 있는 타입을 다른 타입으로 변환할 때는 안전한 캐스트 연산자(as?)를 사용합니다.

val lengthInt: Int? = nullableString as? Int

6. 널 가능한 컬렉션 다루기

널 가능한 컬렉션을 다룰 때는 ?. 연산자와 안전한 호출 함수를 활용하여 안전하게 핸들링할 수 있습니다.

val nullableList: List<String>? = listOf("apple", "banana", null, "orange")
val itemLengths = nullableList
    ?.filterNotNull()
    ?.map { it.length }

Kotlin에서는 이와 같은 널 안전성의 지원으로 실수에 의한 버그를 효과적으로 예방할 수 있기 때문에 안전한 프로그래밍을 위해 꼭 숙지해야 하는 중요한 개념입니다.


참고 문헌: