Develop/Kotlin

[Kotlin] Null Safety : ?와 Nullable 타입

DevPi 2024. 9. 2. 15:09
반응형

Kotlin은 Null Safety(널 안전성)을 제공하는 언어로, 개발자가 더 안전한 코드를 작성할 수 있도록 돕습니다. 특히, Kotlin에서는 null을 명시적으로 처리해야 하며, 이를 위한 기호가 바로 ? 입니다. 이번 포스팅에서는 Kotlin의 Nullable 타입과 이를 다루는 방법에 대해 알아보겠습니다.


1. Nullable 타입: String?의 의미

Kotlin에서 String?와 같은 표현은 null이 될 수 있는 타입을 의미합니다. 즉, String? 타입의 변수는 문자열 값을 가질 수도 있고, null을 가질 수도 있습니다. 반면, String 타입의 변수는 항상 문자열을 가져야 하며, null을 가질 수 없습니다.

 

기본 사용법

var name: String = "Kotlin"  // Null이 될 수 없음
var nullableName: String? = "Kotlin"  // Null이 될 수 있음

nullableName = null  // 가능
// name = null  // 컴파일 오류: Null을 허용하지 않음

이처럼 Kotlin에서는 Nullable 타입을 명시적으로 구분하여 NPE(NullPointerException) 발생 가능성을 줄이고자 합니다.

 

2. Nullable 타입 사용하기

Nullable 타입을 사용할 때는 null 가능성을 처리하는 여러 가지 방법을 제공합니다. 이를 통해 null이 있을 수 있는 상황에서도 안전하게 코드를 작성할 수 있습니다.

 

1) 안전 호출 연산자 ?.

안전 호출 연산자 ?.는 객체가 null이 아닐 때만 접근하여 사용하고, null일 경우 null을 반환합니다. 이는 NPE를 피하는 가장 기본적인 방법입니다.

val length: Int? = nullableName?.length  // nullableName이 null이면 length는 null, 아니면 문자열의 길이 반환
println(length)  // nullableName이 null이면 null 출력

 

2) 엘비스 연산자 ?:

엘비스 연산자 ?:는 좌측 값이 null일 경우 우측의 기본 값을 반환하는 연산자입니다.

val lengthOrDefault: Int = nullableName?.length ?: 0  // nullableName이 null이면 0 반환
println(lengthOrDefault)  // nullableName이 null이면 0 출력

 

 

3) 널 검사 후 접근

Kotlin에서는 일반적인 if 문을 통해 null 여부를 검사하고 안전하게 접근할 수 있습니다.

if (nullableName != null) {
    println(nullableName.length)  // nullableName이 null이 아님이 보장되면 안전하게 사용 가능
}

 

4) 안전한 캐스팅 as?

안전한 캐스팅 연산자 as?를 사용하면 객체를 원하는 타입으로 변환할 수 있습니다. 변환에 실패하면 null을 반환합니다.

val nullableNumber: Int? = "123" as? Int  // 변환 실패, null 반환
println(nullableNumber)  // 출력: null

 

5) Non-null 단언 연산자 !!

!! 연산자는 개발자가 해당 변수가 null이 아님을 확신할 때 사용합니다. 만약 null이라면 NPE가 발생합니다.

val nameLength = nullableName!!.length  // nullableName이 null이라면 NullPointerException 발생

!! 연산자는 강력한 도구이지만, 잘못 사용하면 런타임 예외를 발생시킬 수 있으므로 신중하게 사용해야 합니다.

 

3. Nullable 타입을 사용하는 이유

Kotlin에서 Nullable 타입을 사용하는 주된 이유는 NPE(NullPointerException)를 예방하기 위함입니다. NPE는 Java에서 흔하게 발생하는 오류 중 하나로, 객체가 null인데 접근하려 할 때 발생합니다. Kotlin은 ?를 통해 변수의 null 가능성을 명시적으로 선언하고, 이를 안전하게 처리하도록 강제합니다.

이를 통해 개발자는 컴파일 시점에 null 관련 문제를 인지하고 처리할 수 있어, 런타임에서의 예외를 줄이고 코드의 안정성을 높일 수 있습니다.


요약

  • Nullable 타입 : String?와 같이 ?를 붙여서 선언하면 해당 타입의 변수는 null을 가질 수 있습니다.
  • 안전 호출 연산자 ?. : null 여부를 확인하고 안전하게 접근할 때 사용합니다.
  • 엘비스 연산자 ?: : null일 경우 기본 값을 제공할 때 유용합니다.
  • 널 검사와 안전한 캐스팅 : if 문과 as? 연산자를 사용해 안전하게 값을 다룰 수 있습니다.
  • Non-null 단언 연산자 !! : 확신이 있을 때만 사용하며, 그렇지 않으면 NPE가 발생할 수 있습니다.

Kotlin의 Nullable 타입과 관련된 기능들은 코드의 안전성을 높이고, NPE 발생을 줄이는 데 큰 도움을 줍니다. 이를 통해 Kotlin 개발자는 더욱 안정적이고 예측 가능한 코드를 작성할 수 있습니다.

반응형