Null Safe
자바와 다르게 코틀린은 Null에대해 굉장히 까다롭다.
자바는 함수가 값이 Null인지 보장을 하지 못다. @Nullable, @NotNull 등의 어노테이션으로 처리를 하기는 하지만 유지보수나 가독성 측면에서 제공되는 부분이고 컴파일러가 실제로 에러를 뱉어주지는 못한다. 하지만 코틀린에서는 컴파일러가 에러를 잡아준다.
코틀린에는 안전한 호출(safe call) ?. 연산자와 엘비스 오퍼레이터라고 하는 ?: 연산자가 존재한다. (엘비스 프레슬리의 머리모양을 닮았다해서 엘비스다...)
이 ? 가 붙은경우에만 컴파일러가 Null을 허용한다.
? 가 붙지않은, Nullable 하지 않다고 되어있는 곳에 Nullable 한 값을 할당해 주려고 하면 컴파일 에러가 발생한다.
이런식으로 컴파일러가 에러를 잡아주기 때문에 런타임에서 발생할 수 있는 NPE 를 방지할 수 있다.
var str : String = "Hello World"
str = null
//error
var str_1: String? = "Hello World"
str_1 = null
//Nullable이렇게 코드작성단에서 컴파일러가 잡아주기 때문에 협업을 할 때도 다른사람이 짠 부분의 코드에서 값을 받아야 할 때 코틀린 에서는 받아야 할 값이 null 이 올 수 있는 값인지 null 이 올 수 없는 값인지 명시적으로 알 수 있기 때문에 굳이 null 체크를 하는 코드를 추가해 줄 필요가 없어진다.
var nullable: String? = "Kotlin"
fun nullSafe(str: String?): String? {
return str
}Nullable 하게 선언을 했다면 그 객체에 접근을 할때도 ?. 으로 접근을 해야한다. safe-call 연산자는 이 연산자를 사용하는 객체가 null 값이 아닌 경우에 연산자 뒤의 문장을 수행한다. null 값일 경우에는 뒤의 문장을 수행하지 않고 null 값을 반환한다. -> 즉, null 인 객체의 property 를 참조하거나, 함수를 호출하는 일을 방지할 수 있다.
Nullable한 값에 접근을 할때 Null일 경우에는 Default값을 주고싶을때 엘비스 오퍼레이터를 사용한다.
if else 로 판별해도 되지만 엘비스 오퍼레이터를 사용하는 편이 가독성측면에서 훨씬 좋다. 자바의 삼항연산자와 비슷하게 생겼다. 참고로 코틀린에는 삼항연산자가 없다.
as? 연산자. 지원되지 않는 자료형으로 변환을 시도하는 경우 예외가 발생한다.
자바로 작성된 클래스는 기본적으로 null 값을 허용하도록 처리되며, 코틀린에선 platform type이라 부른다. 플랫폼 타입은 Type!과 같은 형태로 표시된다. 플랫폼 타입은 코틀린에서 자바로 작성한 클래스를 사용할 때에 자동으로 지정되는 타입으로, 이 타입은 개발자가 직접 사용할 수 없다.
Last updated