좌충우돌 코딩

코틀린 - 널(null) 본문

코틀린/순수 코틀린

코틀린 - 널(null)

Tracoding 2023. 3. 29. 20:19

코틀린 언어는 null에 대한 처리에 많은 공을 들인 언어라고 합니다.

많은 프로그래밍 언어들이 프로그래밍을 하면서 항상 이슈에 중심이 바로 null 이기 때문이죠.

 

널은 객체가 선언되었지만 초기화가 이루어지지 않은 상태를 말합니다.

그래서 객체가 널이라는 값을 갖게 되는데, 널을 갖고 있는 객체를 사용하게 널 포인트 익셉션이 발상합니다.

코틀린 형님인 자바를 이용하여 프로그래밍 하다보면 꼭 한번 이상은 만나는 오류이죠.

 

그런데 코틀린은 널에 대해서 민감하게 반응한 언어라고 볼 수 있습니다.

코틀린에서 널에 대한 연산자들을 알아보죠

널 허용  ?

fun main() {
    var value1: String
    value1 = null    // 오류
    var value2: String? 
    value2 = null    // 성공
}

위 코드처럼 모든 변수에 널을 초기화 및 할당을 할 수 없습니다.

널 허용 연산자인 ? 를 이용해서 변수에 널을 허용할 변수인지, 불허용할 변수인지 구분을 할 수 있습니다.

 

널 호출 ?.

코틀린에서는 물음표가 없는 한 변수에 널이 대입이 되지 않습니다. 그래서 개발자가 널 포인트 익셉션에 신경을 안 써도 되는 점이 있죠.

하지만 널 대입이 되는 변수를 만들었다면 개발자가 신경쓰지 않으면 코틀린에서도 널 포인트 익셉션이 발생합니다.

그래도 코틀린에서는 널에 민감하게 받아드리니 조금은 다행이죠

아래 코드를 보실까요?

fun main() {
    var value: String? = "hello"
    var length = value.length	// 오류
}

보기에는 아무 이상이 없는데, 컴파일에서 오류를 표시합니다.

널 안전성에 대한 오류죠. 위 코드를 안전하게 작성하려면 널 호출 연산자를 사용해야합니다.

 

아래의 코드로 보시죠

fun main() {
    var value: String? = "hello"
    var length = value?.length	// 성공
}

value 변수가 널이면 널을 반환하고, 널이 아니면 length 기능을 수행합니다.

널을 반환하긴 하지만 length 기능을 수행하지 않기 때문에 널 포인트 익셉션이 발생하지 않습니다.

오류나기 전에 널을 반환하여 오류를 없애는 것이죠.

 

널 엘비스 ?:

엘비스를 아시나요? 둥근 머리가 길쭉하게 나온 헤어스타일로 유명한 미국 가수입니다.

그 헤어스타일과 비슷한 ?에 :눈 그래서 ?: 엘비스라고 합니다. 고개를 돌려서 보세요. 느낌이 오시나요??

엘비스 연산자는 널 대신 다른 값을 대입할 수 있습니다.

fun main() {
    var value: String? = "hello"
    println("value.length = ${value?.length ?: -1}")    // 5 출력
    value = null
    println("value.length = ${value?.length ?: -1}")	// -1 출력
}

쉽게 생각해서 엘비스 연산자 우측은 not null 좌측은 null 일 때라고 생각하면 됩니다.

 

널 포인트 익셉션 발생 !!

그렇게 널 안전성, 널 안전성을 말했지만, 프로그래밍은 신기하게도 널 포인트 익셉션을 임의적으로 발생 시켜야하는 경우도 있다고 합니다.

아마도 더 안전한 프로그래밍을 위한 방법이겠죠. 널 포인트 익셉션이 발생 안하면 좋지만, 어느 순간 null 할당됨에도 불구하고

개발자가 모를 수 있기 때문에 오히려 오류로 문제점에 대해서 인지하는게 더 좋을테니까요.

fun main() {
    var value: String? = "hello"
    println("value.length = ${value!!.length}")	// 5 출력
    value = null
    println("value.length = ${value!!.length}")	// 널 포인트 익셉션 오류
}

 

 

그럼 이만~~!

'코틀린 > 순수 코틀린' 카테고리의 다른 글

코틀린 - 람다 함수  (0) 2023.04.07
코틀린 - 지연 초기화  (0) 2023.03.31
코틀린 - 다양한 클래스  (0) 2023.03.27
코틀린 - 상속  (0) 2023.03.26
코틀린 - 접근제한자  (0) 2023.03.25
Comments