ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 널 안정성
    🔖 Kotlin 2024. 12. 29. 22:09

    🤔 Kotlin에서 Null 안정성을 보장하는 이유

    1. Java의 NPE(null pointer exception) 문제
      • 자바는 모든 객체가 기본적으로 null을 허용해, 개발자가 별도로 null 체크를 해주어야 한다.
      • 따라서 NPE이 발생하는 코드가 흔하며 이는 자바 개발자가 가장 많이 마주치는 오류중 하나이다.
        • 이를 방지하기 위해 많은 양의 보일러플레이트 코드(명시적 null 체크)가 필요
    2. Kotlin 설계 철학
      • 코틀린은 안전하고 간결한 코드 작성을 목표로 설계
      • null 안정성을 언어차원에서 지원해 개발자의 실수를 방지하고 코드의 신뢰성을 높인다.
      • 개발자가 명시적으로 null 가능성을 처리해 런타임 오류를 최소화
    3. 생산성과 가독성 향상
      • null 체크를 자동화하고 코드 가독성을 높임으로써 개발 생산성 향상
      • 명시적인 nullable 타입 선언과 연산자는 코드의 의도를 더 명확히 전달하게 한다.

     

    🚀 Kotlin에서의 널 처리

    1️⃣ Nullable Types(?)

    • 코틀린에서 변수에 null을 허용할지 명시적으로 선언
    val nonNullable: String = "Hello"  // null 불가
    val nullable: String? = null      // null 가능

     

    장점

    • 컴파일 타임 체크 : null 관련 오류를 코드 작성 시점에 확인해 런타임 오류 방지
    • 명시적으로 nullable 과 non-nullable 변수를 구분해 코드의 안정성과 가독성을 높인다.

     

    2️⃣ ?. ( Safe calls )

    • 객체가 null 인지 확인한 후 안전하게 호출
    val length = nullableString?.length // nullableString이 null이라면 호출을 생략

     

    장점

    • NPE 방지 : null 인지 상태를 직접 확인하지 않아도 안전하게 호출이 가능
    • 코드 간결화: 명시적인 null 체크를 위한 코드가 줄어든다.

     

    3️⃣ ?: ( Elvis Operator)

    • 값이 null인 경우 기본값 반환
    val length = nullableString?.length ?: 0  // null이면 기본값 0 반환

     

    장점

    • Null 대체 값을 제공 : null 상황에서 처리해야 할 값을 쉽게 설정가능
    • 의미 명확성: null을 처리하는 의도를 명확히 한다.

     

    4️⃣ as? ( Safe casts )

    • 객체를 특정 타입으로 변환하려고 할 때, 변환이 불가능할 시 null을 반환
    • Java에서 강제 캐스팅에서 발생할 수 있는 ClassCastException을 방지
    val hello: Any = "Hello"
    val str: String? = obj as? String // 성공 - Hello 반환
    val number: Int? = obj as? Int // 실패 - null 반환

     

    장점

    • 안전하게 타입 변환을 시도할 수 있다.

     

    5️⃣ !! ( not-null assertion )

    • nullable 타입의 변수를 강제로 non-null 타입으로 변환
    • 해당 변수가 null인 경우에는 NPE이 발생
    • null이 아닌 것이 확실할 때 사용하는 도구이다.
    val nullable: String? = null
    val length = nullable!!.length

     

    ⚠️ 주의

    • 잘못 사용하면 런타임 오류를 유발할 수 있다.
    • !! 보다는 안전한 다른 대안을 사용하는 것이 좋다.

     

    6️⃣ let 함수

    • 객체가 null이 아닌 경우에만 특정 작업을 수행할 때 사용
    • null-safe call (?.) 과 함께 사용
    val nullable: String? = "Hello"
    nullable?.let {
      println(it.length)
    }

     

    장점

    • null 을 명시적으로 처리하는 코드를 작성할 수 있다.
    • 스코프 함수로, 변수의 스코프를 제한해 코드의 가독성을 높인다.

     

    📖 Reference.

    Null safety | Kotlin

    코틀린의 널 안정성: 안전한 널 처리를 위한 가이드

    '🔖 Kotlin' 카테고리의 다른 글

    👾 MockK와 Mockito  (0) 2025.01.09
    😎 Infix Function  (0) 2024.12.30
    🦥 lateinit 과 lazy  (0) 2024.12.29
    Kotlin Coroutines  (0) 2024.12.28
    Unit / Nothing  (0) 2024.11.25

    댓글

Designed by Tistory.