본문 바로가기
언어/코틀린

[Kotlin] 널 안전성이란?

by 코딩히어로 2022. 7. 20.
728x90

1



코틀린에서 널 안전성이라는 개념이 등장하는데

널이란 객체가 선언되었지만 초기화되지 않은 상태를 의미하는 것으로

객체가 널인 상황에서 널 포인터 예외가 발생하지 않도록 연산자를 비롯해 여러 기법을

제공한다는 의미로 해석할 수 있습니다

 

val data1: String = "hello"
val data2: String? = null

 

위 소스코드에서 data1 변수에는 "hello"라는 문자열을 저장했습니다

그런데 실제로는 "hello"라는 문자열 데이터가 저장되어 있는 주소가 대입되고

그 주소로 문자열 데이터를 이용하게 됩니다

 

data2 변수에는 null을 대입했는데 이렇게 하면 data2 변수는 아직 주소 값을 얻지 못합니다.

즉 변수가 선언되었지만 이용은 할 수 없는 상태인 것입니다

 

이처럼 널인 상태의 객체를 이용하면 널 포인트 예외가 발생하는데

널 포인트 예외는 널인 상태의 객체를 이용할 수 없다는 오류입니다

 

이때 널 안정성이란 널 포인트 예외가 발생하지 않도록 코드를 작성하는 것을 말합니다

널 포인트 예외는 오류이므로 당연히 발생하지 않아야 하지만 중요한 건 이런 처리를

어느단에서 맡아서 하느냐가 중요합니다

 

fun main(){
    var data: String? = null
    val length = if(data == null){
    	0
    }else{
    	data.length
    }
    println("data len = $length")
}

 

위 코드의 실행 결과는 data len = 0 이 출력됩니다

String 타입의 data 변수를 null로 선언하고 data 변수에 대입한 문자열의 개수를

얻기 위해서 length를 이용했는데 data가 null인 상태에서 data.length 코드를 실행하면 널 포인트 예외가 발생합니다

그렇기 때문에 if문으로 data가 null인지 여부를 확인한 뒤에 처리하도록 구문을 작성합니다

 

하지만 이런식으로 널 안정성을 확보하는 노력을 개발자가 하게 된다면 객체가 null인지

하나하나 체크해야 하는 코드를 작성해야 하기 때문에 너무 비효율적입니다

 

fun main(){
    var data: String? = null
    println("data length : ${data?.length?:0}")
}

 

data가 null이면 0을 반환하고 null이 아니면 length를 이용해 문자열 개수를 얻는 소스코드로

위에 작성한 코드와 동일하게 동작하지만 코드에서 null을 점검하지 않는다는 차이점이 있습니다

즉 null을 일일이 점검하지 않아도 널 안정성을 확보한 것입니다

 

var data1: String = "abcd"
data1 = null			// 오류

var data2: String? = "abcd"
data2 = null			// 성공

 

위 코드에서처럼 코틀린에서는 널 허용 연산자를 제공하고 있으며

변수 타입을 널 허용과 널 불허로 구분합니다

data2의 경우에는 널을 허용하는 ? 연산자가 붙었기 때문에 null을 대입할 수 있습니다

728x90
반응형

'언어 > 코틀린' 카테고리의 다른 글

[Kotlin] 클래스와 생성자  (6) 2022.06.14
[Kotlin] 조건문 When  (2) 2022.06.13
[Kotlin] 함수 선언  (2) 2022.06.13
[Kotlin] 데이터 타입  (2) 2022.06.10
[Kotlin] 변수 선언  (1) 2022.06.10

댓글