Kotlin에서 Null Safety는 중요한 개념 중 하나로, null 값을 안전하게 처리하는 방법을 제공하여 개발 중 발생할 수 있는 오류를 최소화합니다. 특히, JavaScript와 같은 언어에서는 null 값을 제대로 다루지 않으면 런타임 에러가 발생할 수 있는데, Kotlin에서는 이를 컴파일 단계에서 미리 방지할 수 있도록 돕는 여러 기능이 존재합니다.

Null Safety란?

Kotlin의 Null Safety는 프로그램이 null 값으로 인해 발생하는 NullPointerException을 방지하는 것을 목표로 합니다. NullPointerException은 런타임에 자주 발생하는 오류 중 하나로, 객체가 null인지 확인하지 않고 사용하려 할 때 발생합니다. Kotlin은 이러한 오류를 컴파일 시점에서 미리 잡아내기 위한 안전장치를 제공합니다.

Kotlin에서는 변수가 null을 가질 수 있는지 여부를 명확히 선언해야 하며, 이를 통해 개발자는 실수로 null 값에 접근하는 것을 방지할 수 있습니다. 이를 지원하는 주요 기능은 nullable 타입, safe call, 그리고 Elvis 연산자입니다.

Nullable 타입 (?)

Kotlin에서는 변수가 null 값을 가질 수 있음을 명시적으로 표현할 수 있습니다. 이때 사용하는 것이 nullable 타입입니다. 기본적으로 Kotlin의 변수는 null을 허용하지 않지만, nullable 타입으로 선언하면 null을 허용하게 됩니다.

var name: String? = "Kotlin"
name = null // 가능, null 값을 가질 수 있음

String?처럼 ?를 붙여주면 해당 변수가 nullable 타입으로 선언되며, 이 변수는 null 값을 가질 수 있습니다.
반면에 String처럼 nullable 타입을 명시하지 않으면 null 값을 허용하지 않습니다.

Safe Call (?.)

nullable 타입의 변수를 사용하다 보면 null일 수 있는 상황에서 속성이나 메서드에 접근해야 할 때가 많습니다. 이때 null 검사를 수동으로 할 수도 있지만, Kotlin에서는 safe call 연산자(?.)를 제공하여 더 간결하고 안전하게 사용할 수 있습니다.

val length: Int? = name?.length

위 코드에서 name이 null이 아니면 length 속성에 접근하고, null이면 그냥 null을 반환합니다.
이 방식은 null 체크를 간결하게 처리할 수 있으며, 런타임 에러를 방지할 수 있습니다.

Elvis 연산자 (?:)

Elvis 연산자는 null 처리에서 기본값을 지정할 때 사용하는 연산자입니다.
nullable 변수에서 safe call을 사용하여 값이 null일 경우, Elvis 연산자를 통해 미리 지정한 기본값을 반환하도록 할 수 있습니다.

val length: Int = name?.length ?: 0

위 코드에서 name이 null일 경우 name?.length는 null을 반환하고, Elvis 연산자 ?:의 기본값 0이 반환됩니다.
이를 통해 null인 경우에도 안전하게 처리하면서 원하는 기본값을 설정할 수 있습니다.

정리

Kotlin의 Null Safety는 프로그램이 런타임에서 발생할 수 있는 null 관련 오류를 컴파일 시점에서 미리 방지하여 코드의 안정성을 높이는 기능입니다. 이를 위해 Kotlin에서는 nullable 타입(?), safe call(?.), Elvis 연산자(?:)와 같은 유용한 도구들을 제공합니다.

  • Nullable 타입(?): null을 허용하는 타입.
  • Safe call(?.): null이 아니면 연산을 수행하고, null이면 null 반환.
  • Elvis 연산자(?:): null이면 기본값을 반환.