티스토리 뷰

반응형

널 안정성

자바로 프로그램 개발을 하다보면 널 포인터 예외(Null Pointer Exception) 이 빈번히 발생한 것을 확인 할 수 있습니다.

자바로 구성된 안드로이드에서는 안드로이드 서포트 라이버러리의 @Nullable, @NonNull 어노테이션을 사용하여 객체의 널 허용 여부를 표시하였습니다. 하지만 정적 분석 도구에서만 지원하므로, 컴파일 단계에서는 여전히 널 포인터 예외가 발생할 소지가 있습니다.

널 허용 여부 표기

코틀린은 별도의 표기가 없는 경우 널 값 허용을 하지 않습니다.

val nullableString : String? = null
val nonNullString: String = "Foo"
val errorNullString : String //Error 발생. 코틀린은 널 값 허용 하지 않음

널 허용하지 않는 대신 다양한 연산자를 제공하여 Null에서 자유롭게 제공하고 있습니다.

엘비스(?:) 연산자

널 값을 허용하지 않는 값 혹은 변수에 널 값을 반환할 수 있는 함수의 결과를 대입해야 하는 경우

// value가 null이 아닌 경우는 value, null 이라면 default 을 반환 합니다.
value ?: default

안전한 호출(?.) 연산자

안전한 호출(safe call) 연산자를 사용하여 널 값 확인과 값 접근/함수 호출을 한번에 할 수 있습니다.

// france가 null 이 아닐 경우에만 해당 값을 대입 가능, 그렇지 않은 경우 null을 source에 대입
val source = france?.tomato
source?.france()

// 주소가 없거나 line2가 없을 경우 "No address" 반환
val line : String = contack.address?.line2 ?: "No address"

안전환 자료형 변환(as?) 연산자

안전한 변환 연산자는 자료형 변환이 실패할 경우 예외를 발생시키는 대신 널 값을 반환합니다. 엘비스 연산자를 함께 사용하면 변환에 실패했을 때 기본 값으로 지정할 수 있습니다.

val foo: String = "foo"
// 자료형 변환에 실패 했을 경우 기본값을 0으로 지정하게 됩니다.
val bar : Int = foo as? Int ? 0

널 값이 아님을 명시하기: 널 값 아님 보증 (!!)

상황에 따라 널 값을 포함할 수 있는 타입에 널 값이 아닌 값만 포함되는 경우가 생길 수 있습니다. 널 값이 아님을 보증하려는 항목 뒤에 !! 을 붙여 사용합니다. 이 방식은 널 포인터 예외가 발생하므로 유의 해야 합니다.

// user 의 address 가 널이 아님을 보증합니다.
val address = user.address!!

나중에 초기화되는 변수를 위한 lateinit 키워드

설계상의 이유로 클래스를 생성한 후 나중에 따로 초기화 하는 경우가 있습니다. lateinit 키워드를 사용하면 초기화 없이 변수만 선언 가능합니다. 초기화 하지 않은 상태로 사용하며 널 포인터 예외가 발생하므로 초기화 작업을 필수로 하셔야합니다.

class MainActivity: Activity(){
// lateinit을 활용하여 나중에 초기화를 수행할 객체를 표시하였습니다.
   lateinit var user: User
}

참고

https://kotlinlang.org/docs/reference/

http://www.androidhuman.com/tag/kotlin/

반응형

'프로그래밍 > Kotlin' 카테고리의 다른 글

Inline함수에 대해서 알아보자  (0) 2023.08.27
댓글