본문 바로가기

프로그래밍언어/Kotlin

[Kotlin] 튜토리얼 따라가기 (5) (Null safety)

반응형

프로그래밍을 하다보면 null 값을 만나는 경우가 있다. null 값으로 인해서 예외가 발생하는 경우가 많은데, 코틀린에서는 null 값을 방지하는 null safety 기능을 가지고 있다. 이를 통해서 코틀린은 런타임이 아닌 컴파일 타임에 null 값으로 인한 잠재적 위험을 탐지할 수 있다.

 

null safety 기능을 통해서 null 값이 가능한 곳을 명시적으로 선언하거나, null 값을 확인하거나, null 값을 반환할 여부가 있는 프로퍼티나 함수를 안전하게 호출하기, null 값이 발견되었을 때 수행할 동작 설정 등을 할 수 있다.

1. Nullable types

코틀린에서는 기본적으로 null 을 허용하지 않는다. 하지만 명시적 타입 뒤에 '?' 기호를 붙여서 nullable type 으로 선언할 수 있다.

 

fun main() {
    // neverNull has String type
    var neverNull: String = "This can't be null"

    // Throws a compiler error
    neverNull = null

    // nullable has nullable String type
    var nullable: String? = "You can keep a null here"

    // This is OK
    nullable = null

    // By default, null values aren't accepted
    var inferredNonNull = "The compiler assumes non-nullable"

    // Throws a compiler error
    inferredNonNull = null

    // notNull doesn't accept null values
    fun strLength(notNull: String): Int {                
        return notNull.length
    }

    println(strLength(neverNull)) // 18
    println(strLength(nullable))  // Throws a compiler error
}

 

위의 예제에서 neverNull 과 inferredNonNull 은 컴파일러에서 String 타입으로 인식되기 때문에 null 값을 허용하지 않는다. 그렇기 때문에 컴파일러에서 에러를 출력한다. nullable 의 경우에는 String? 으로 선언되었기 때문에 null 값을 허용한다. 또한 nullable 은 null safety 가 아니기 때문에 String 의 프로퍼티인 length 에 접근하는 경우 에러가 발생한다.

2. Check for null values

fun describeString(maybeString: String?): String {
    if (maybeString != null && maybeString.length > 0) {
        return "String of length ${maybeString.length}"
    } else {
        return "Empty or null string"
    }
}

fun main() {
    val nullString: String? = null
    println(describeString(nullString))
    // Empty or null string
}

 

위의 예제와 같이 조건문을 사용하여 null 여부를 확인할 수 있다.

3. Use safe calls

null 일수도 있는 객체의 프로퍼티에 접근하기 위해서는 safe call 연산자인 '?.' 연산자를 통해 안전하게 접근할 수 있다. 해당 연산자는 객체가 null 이거나 접근하려는 프로퍼티들 중 하나라도 null 인 경우에 null 값을 반환한다. 이를 통해서 null 값으로 인한 이슈에 대비할 수 있다.

 

fun lengthString(maybeString: String?): Int? = maybeString?.length

fun main() {
    val nullString: String? = null
    println(lengthString(nullString))
    // null
}

 

위 예제에서 lengthString() 은 입력된 객체의 length 를 반환하는데, 이때 safe call 연산자를 이용하고 있다. 이때문에 입력된 nullString 이 null 이어도 에러가 발생하지 않고 null 값을 반환한다.

 

안전 호출 연산자는 프로퍼티뿐만 아니라 함수 호출에서도 사용할 수 있다. 이 경우에 null check 는 함수 호출 전에 수행되어 만약 null 이 발견되는 경우 함수 호출을 하지 않고 null 을 반환한다.

 

fun main() {
    val nullString: String? = null
    println(nullString?.uppercase())
    // null
}

4. Use Elvis operator

Elvis operator '?:' 를 사용하면 null 값을 발견했을 때 반환할 기본값을 지정할 수 있다.

 

fun main() {
    val nullString: String? = null
    println(nullString?.length ?: 0)
    // 0
}

 

위의 예제와 같이 엘비스 연산자 좌측에 null check 를 위한 값을 작성하고 우측에 null 인 경우에 반환할 값을 작성한다.

[Reference]

- https://kotlinlang.org/docs/kotlin-tour-null-safety.html

 

Null safety | Kotlin

 

kotlinlang.org

 

 

 

반응형