본문 바로가기
Kotlin

Kotlin - null 가능성, lateinit ,lazy

by 봄석 2019. 1. 3.

Kotlin - null 가능성, lateinit, lazy


null 가능성

기본적으로 객체를 불변으로 보고 null값을 허용하지 않습니다.

null값을 호용하려면 별도의 연산자가 필요하고 null을 허용한 자료형을 사용할 때도 별도의 연산자들을 사용하여 안전하게 호출해야 합니다.


null 허용?

코틀린에서 기본적으로 null 값을 허용하지 않습니다 .따라서 모든 객체는 생성과 동시에 값을 대입하여 초기화 해야합니다.


아래 코드는 초기화 하지 않아 에러가 발생합니다.


val a:String

에러 Property must be initialized or be abstract

Compilation Error

다음 코드는 null 값으로 초기화 해서 에러가 발생합니다.

val a: String =null

Null can not be a value of a non-null type String

Compilation Error


코틀린에서 null 값을 허용하려면 자료형의 오른쪽에 ? 기호를 붙여주면 됩니다.

아래 코드는 null값을 허용하는 String 객체이기 때문에 에러가 발생하지 않습니다.


val a:String=null


자바에서는 int, long, double과 같은 프리미티브 자료형은 null 값을 허용하지 않습니다만,

그외 모든 클래스형 변수는 null값을 허용합니다.



lateinit 키워드를 사용한 늦은 초기화

안드로이드를 개발할 때는 초기화를 나중에 할 경우가 있습니다. 이때는 lateinit 키워드를 변수 선언 앞에 추가하면 됩니다. 안드로이드에서는 특정 타이밍에 객체를 초기화할 때 사용합니다.

초기화를 잊는다면 잘못된 null값을 참조하여 앱이 종료될 수 있으니 주의해야 합니다.

lateinit var a:String //OK
 
="hello"
println(a) //hello




lateinit은 다음 조건에서만 사용할 수 있습니다

1) var 변수에서만 사용합니다.

2) null 값으로 초기화 할 수 없습니다.

3) 초기화 전에는 변수를 사용할 수 없습니다

4) Int, Long, Double, Float에는 사용할 수 없습니다.



lazy로 늦은 초기화

lateinit이 var로 선언한 변수의 늦은 초기화라면 lazy는 값을 변경할 수 없는 val을 사용할 수 있습니다. val 선언 뒤에 by lazy 블록에 초기화에 필요한 코드를 작성합니다. 마지막 줄에는 초기화 할 값을 작성합니다. 마지막 줄에는 초기화 할 값을 작성합니다.

str이 처음 호출될 때 초기화 블록의 코드가 실행됩니다. println() 메소드로 두번 호출하면 처음에만 "초기화"가 출력됩니다.

val str:String by lazy{
        println("초기화")
        "hello"
}
 
println(str) // 초기화; hello
println(str) //hello


lazy로 늦은 초기화를 하면 앱이 시작될 때 연산을 분산시킬 수 있어 빠른 실행에 도움이 됩니다.



lazy는 다음 조건에서만 사용할 수 있습니다.

1) val 에서만 사용합니다.


조건이 적기 때문에 상대적으로 lateinit 보다 편하게 사용할 수 있습니다.



댓글