반응형

이 게시물은 다음 링크를 참조하여 학습했습니다

 

[Kotlin] 코틀린의 널 안전성(Null Safety) · Challengist

[Kotlin] 코틀린의 널 안전성(Null Safety) 01 Oct 2019 | Kotlin 코틀린의 널 안전성(Null Safety) 이 글은 코틀린 공식문서를 공부하며 번역한 글입니다. 틀린 부분이나 어색한 부분을 댓글로 알려주시면 감사

shinjekim.github.io

 

Null safety | Kotlin

 

kotlinlang.org

 

이번 게시물은 Null Safety에대한 내용이다.

이전에 간단하게 정리한적이 있긴 하지만, 실무에서 많이 쓰인다는 이야기를 듣기도 했고, 좀더 구체적으로 정리할 필요성도 느껴서 정리하게 됐다.

1. nullable

kotlin은 기본적으로 null값을 허용하지 않는다.

null을 참조하고자 한다면 ? 연산자를 사용해야한다.

아래처럼 변수 타입에 ?를 붙혀주면 null을 참조할 수 있다.

var b: String? = "abc"
b = null
print(b)

 

2. null check

null을 변수로 지정했을 때 변수의 프로퍼티에 접근한다면, NPE가 발생할 것이다.

물론 애초에 null값을 지정안해주면 되긴하지만, 상황에 따라 null값을 넣어줘야 할 상황도 있을 수 있을 것이다.

이러한 상황을 예방하기 위해 null check를 해줘야 한다.

 

2-1. 조건을 통해 확인

말 그대로 조건문을 통해 null을 확인해주는 방법이다.

val b: String? = "Kotlin"
if (b != null && b.length > 0) {
    print("String of length ${b.length}")
} else {
    print("Empty string")
}

 

이러한 방법은 일반적으로 변수 b가 변경 불가능할때에만 동작하도록 하는게 바람직하다.

변수 b가 검증된 이후에 가변적이라면 null이 될 수 있기 때문이다.

 

2-2. let scope

null이 아닌 값에 대해서만 특정 연산을 수행하려면 let을 사용하는 방법도 있다.

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
    item?.let { println(it) } // prints Kotlin and ignores null
}

위 코드에서는 item이 null이 아닐 때만 스코프 안의 println문이 동작하고, null일때는 동작하지 않는다.

 

2-3. Elvis Operator

엘비스 연산자는 ?: 이다.

엘비스 연산자를 사용하면 2-1. 조건문을 통해 null값을 체크한 것을 좀더 간단하게 사용할 수 있다.

val l: Int = if (b != null) b.length else -1
val l = b?.length ?: -1

위 두 코드는 같은 내용이다!

 

또한 return이나 throw에서도 엘비스 연산자를 유용하게 사용할 수 있다.

fun foo(node: Node): String? {
    val parent = node.getParent() ?: return null
    val name = node.getName() ?: throw IllegalArgumentException("name expected")
    // ...
}

 

2-4. not-null Operator

!!연산자를 사용해서 해당 변수가 not-null타입이라고 명시해주는 방식이다.

변수가 null일 경우 NPE를 throw한다.

val l = b!!.length

 

반응형

'Legacy' 카테고리의 다른 글

[Kotlin #12] Coroutines - Cancellation and timeouts  (0) 2022.06.09
[Kotlin #11] Coroutines  (0) 2022.06.09
[Kotlin #9] lateinit, lazy  (0) 2022.05.24
[Kotlin #8] Companion Object  (0) 2022.05.24
[Kotlin #7] Sequences  (0) 2022.05.23

+ Recent posts