본문 바로가기

Android on Kotlin

[코틀린/Kotlin] ?(물음표) 와 !!(느낌표 2개) 차이점

 

1. 간단 정의

? 는 변수에 null 값을 넣을 수 있다(널 허용)는 것을 뜻함.

!! 는 해당 변수가 현재 널 값이 아니라고 컴파일러에게 알려줘서 컴파일 에러가 나지 않도록 할 때 사용.


2. 이게 왜 필요한지? (사례를 통해 설명)

 

코틀린은 기본적으로 기본 변수 타입에 Null 을 허용하지 않음으로써, NPE(NullPointerException)를 예방할 수 있어 다른 언어에 비해 비교적 널 안전성을 가진 언어입니다. 그래서 기본 변수 타입에 null을 넣으려 하면 아래처럼 에러가 납니다.


 

그럼 변수에 Null 값을 넣고 싶으면 어떻게 해야할까요?

변수 타입 뒤에 널 허용을 뜻하는 '?' 를 붙여주면 됩니다.

결국 '?' 는 null 허용을 뜻합니다. ("이 변수에는 null 값이 들어갈 수 있다" 라고 개발자가 컴파일러에게 통지하는 셈)


변수 타입에 '?' 를 붙여 정상적으로 null 값을 넣어 줬습니다.

근데 이제 두번째 문제가 생겼습니다.

널 허용 변수타입(Int?)과 널 불허용 변수타입(Int)을 더하려고 하니 아래처럼 컴파일 에러가 납니다.


아래 그림처럼 a 변수의 실제 값은 null 이 아니여도 널허용변수와 널불허용변수의 연산으로 인해 생길 수 있는 NPE(NullPointerException) 를 방지하기 위해 컴파일 에러가 납니다.


그럼 이럴때 에러 해결을 어떻게 할까요?

이때 사용하는 것이 !! 입니다.

!!는 "널 값이 아니다" 라고 개발자가 컴파일러에게 통지를 해주는 것입니다.

컴파일 에러가 없어지고 정상적으로 연산이 됨.

 

 

이렇게 하면 컴파일 에러 없이 개발자가 생각한대로 연산이 이루어집니다.