코틀린에서 널 안전성이라는 개념이 등장하는데
널이란 객체가 선언되었지만 초기화되지 않은 상태를 의미하는 것으로
객체가 널인 상황에서 널 포인터 예외가 발생하지 않도록 연산자를 비롯해 여러 기법을
제공한다는 의미로 해석할 수 있습니다
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을 대입할 수 있습니다
'언어 > 코틀린' 카테고리의 다른 글
[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 |
댓글