Develop!/Kotlin

Null이 될 수 없는 타입 in Kotlin

체리필터 2023. 9. 6. 16:49
728x90
반응형

Java에서 가장 큰 실수가 null 을 만든 것이라고 한다. 그래서 Kotlin에서도 null을 없애려고 하였지만 Java를 지원하기 위해서 null을 사용하기는 한다.

Java에서는 null이 될 수 없을 경우에는 lombok의 @NonNull 어노테이션을 사용한다. 코틀린에서는 기본이 non-null 이다. Java와의 연동으로 인해 null을 허용하고 싶으면 '?'를 사용하면 된다. 다음의 코드를 통해 사용법을 확인해 볼 수 있다.

fun nullableType() {
    val s1 = "abc"

    // compile error
    // val s2: String = null

    val s3: String? = null
    val s4: String? = s1

    // compile error
    // val s5: String = s4
    val s6 = s4

    println(s1)
    println(s3)
    println(s4)
    println(s6)
}

s1은 null이 될 수 없다. 코틀린의 기본은 non-null 이기 때문이다. s2의 경우처럼 null을 대입하려고 하면 다음과 같은 오류가 떨어진다.

non-null type String에 null을 넣을 수 없다는 에러이다.

null이 가능한 변수는 Type 뒤에 ?를 붙여 주면 된다. s3처럼 null을 대입할 수 있게 된다.

s4의 경우 null도 허용 가능하기 때문에 null이 아닌 s1을 넣을 수 있다.

s5를 null이 허용되지 않는 String으로 정의 한 후 nullable 한 s4를 넣으려고 해도 오류가 난다.

String과 String?의 타입이 서로 맞지 않는다고 나온다. 약간의 차이처럼 보이지만 아예 다른 타입이라고 생각하는 것이 좋다.

타입 추론을 통해 s6는 s4처럼 nullable이 되게 된다.

nullable인 변수의 경우 다음과 같이 작성하게 되면 컴파일 오류가 난다. (Java는 문제 오류 없을 듯...)

fun dereference() {
    val s1: String = "abc"
    val s2: String? = s1

    println(s1.length)

    // compile error
    // s2.length

    if (s2 != null) {
        println(s2.length)
    }
}

s2.length를 쓰려고 하면 다음과 같은 오류가 나온다.

'.'을 safe 하거나 non-null인 경우에만 사용할 수 있다는 메시지이다. Java의 경우에는 컴파일 오류는 안나지만 런타임에 null이 들어와서 NPE가 많이 발생하게 되는 모습을 볼 수 있다.

하지만, s2가 null이 아님을 확인 한 이후 '.'을 사용하게 되면 s2가 null이 아닌게 분명하므로 사용할 수 있게 된다.

 

728x90
반응형

'Develop! > Kotlin' 카테고리의 다른 글

제네릭스 in Kotlin  (0) 2023.09.22
안전한 호출과 엘비스 연산자 in kotlin  (0) 2023.09.14
구조 분해 선언 in Kotlin  (0) 2023.09.06
Data Class in Kotlin  (0) 2023.09.04
when in kotlin  (0) 2023.08.23