코틀린은 많은 장점을 가지고 있지만,
자바를 사용하던 개발자들이 가장 피부로 와닿는 장점을 뽑으라고 한다면 Null 타입 시스템이 꼽히지 않을까 생각합니다.
코틀린에서는 강력한 Null Safety 한 문법을 제공함으로서 NPE의 발생을 획기적으로 사전에 차단합니다.
Nullable 타입
코틀린은 모든 객체타입이 Nullable 한 타입과 NonNull 타입으로 나뉩니다.
class Person(
val name: String,
val nickName: String?,
val age: Int
)
타입 뒤에 ? 가 붙은 타입은 Nullable 한 타입이 됩니다.
?가 붙지 않은 타입의 변수에는 null 을 할당할 수 없습니다.
하지만 개발을 하다보면 어떤 Nullable 한 값을 리턴하는 함수를 통하여 얻어낸 값을 NonNull 타입에 할당하고 싶은 경우가 있을 것입니다. 그럴때는 !! 연산자를 사용하면 얻어낸 Nullable 한 타입이 해당 연산에서는 NonNull 하다고 컴파일러에게 알릴 수 있습니다.
!! 으로 명시적으로 NonNull 임을 알린 값이 Null 인 경우 NPE 가 발생합니다.
Nullable 한 타입 핸들링
Nullable 한 타입을 명시적으로 사용함으로서,
코틀린은 Nullable 한 타입의 Null 값을 핸들링하는 많은 문법을 지원합니다.
안전한 호출 연산자 ?.
?. 는 null 체크와 연산 수행을 간결한 문법으로 한번에 제공합니다.
?. 은 해당 값이 null 이 아닐 경우 뒤에 명시한 해당 타입이 지닌 연산이 수행되고, null 일 경우 null 을 리턴합니다.
위의 간결한 코드는 아래의 자바 코드로 컴파일됩니다.
이처럼 코틀린의 ?. 연산은 복잡한 null 체크 코드를 간결하고 이해하기 쉬운 코드로 표현할 수 있습니다.
엘비스 연산자 ?:
엘비스 연산자 ?: 는 Nullable 한 값의 기본값을 지정할때 유용하게 사용할 수 있습니다.
엘비스 연산자는 값이 null 이 아닐경우 값을, null 일 경우 지정한 값을 리턴합니다. 우변에서는 익셉션을 던질 수도 있습니다.
자바의 Optional 의 orElseGet(), orElseThrow 와 유사한 동작을 합니다. (orElse() 와는 메소드 수행 여부의 차이가 있습니다.)
타입파라미터
타입파라미터 T 는 물음표가 없더라도 Nullable 한 타입으로 해석됩니다.
Nullalble 타입으로 해석되므로, 위에서 소개한 Null Safety 문법들을 사용하여 안전한 코드를 작성할 수 있습니다
이처럼 코틀린은 강력한 Null Safety 한 문법을 제공함으로서 Null Pointer Exception 을 획기적으로 줄임과 동시에
복잡하고 읽기힘든 Null 체크 문법을 간결하게 표현할 수 있도록 개선했습니다.
소개한 내용 이외에도 let, as 함수를 안전한 캐스팅, 엘비스 와 함께 사용하여 처리하는 패턴 등이 Kotlin In Action 이나
기타 기본서에 소개되지만, Null 을 핸들링 하는 직접적인 방법은 아니므로 소개만 하고 글 작성을 마치겠습니다.
'Kotlin' 카테고리의 다른 글
Kotlin 에서 GraphQL-spqr 사용시, Companion Object 스키마 빌드 오류 (0) | 2022.05.02 |
---|---|
Kotlin 의 inline 함수 (0) | 2022.03.24 |
Mockk 으로 Kotlin 현재 시간 관련 로직 테스트하기 (0) | 2022.03.21 |