Hello, Android!

코틀린의null 본문

Kotlin

코틀린의null

lwndnjs93 2020. 2. 19. 21:51

지금까지 대부분의 언어들에서는 변수에 null이 들어가면 NullPointException(NPE)이 발생한다

하지만 코틀린에서는 필요한 경우 null을 허용하는 변수를 사용할수있다

null을 허용하는 변수를 사용하기 위해서는 null을 검사하고 null이 들어왔을때를 대비해야한다

 

코틀린에서는 변수 선언시 타입의 뒤에 ? 를 붙여 null을 허용할수 있다

타입 뒤의 ? 없이 null을 할당하게 되면 빨간 줄이 나오면서 null값을 넣을수 없다고 나온다

- 세이프 콜, non null

? 를 통해 널값을 허용한 값을 참조하고자 했더니 다시 빨간 줄이 나왔다

(Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String)

이라는 설명이 나왔다

string이 ? 가 붙은 null을 허용하는 변수이기때문에 세이프 콜(?.) 또는 non null(!!.)을 사용하라고 나온다

설명을 따라 ?. 를 통해 세이프 콜을 했지만 이번에도 빨간 줄이 나온다 

이번에 나온 빨간줄은 string 변수는 ? 가 있는 null허용이지만 size변수는 ?가 없어 null을 허용하지 않기 때문이다

?. 을 통한 세이프 콜의 특징은 변수의 값이 있으면 .length를 정상적으로 진행을 하지만 

값이 null일 경우 .length를 아예 진행하지 않고 null을 출력하여 안전하게 null을 사용할수 있다

non null(!!.)를 사용하게 되면 string 변수에 할당된 값이 null이 아니라 단정하게 되어 컴파일은 진행이 된다

하지만 실행 도중 null이 들어와 NullPointException(NPE)가 발생하게 된다

 

만약 세이프 콜 또는 non null을 사용하지 않고 전통적인(?)방식으로 if문 등 조건문을 활용하여 null 체크를 할 수도 있다

하지만 위와 같이 조건문을 사용하는 경우, 값이 null일때 필요한 특정 값을 정해줄 수 있는 장점이 있다

그러면 세이프 콜을 버리고 조건문을 사용해야 할까?

 

조건문 대신 엘비스 연산자를 사용하면 더욱 편리하게 사용할 수 있다

?: 를 기준으로 왼쪽이 null이 아니면 string?.length의 결과 값을 반환하고 null이면 ?: 의 오른쪽에 있는 값을 반환한다

'Kotlin' 카테고리의 다른 글

코틀린의 Any  (0) 2020.02.22
스마트 캐스트, 자료형 검사  (0) 2020.02.22
문자열 String  (0) 2020.02.18
import와 확장함수  (0) 2018.11.26
조건분기 when if  (0) 2018.11.22