[Kotlin] 프로퍼티 초기화, lateinit, lazy

jeunguri·2022년 11월 28일
0

kotlin

목록 보기
5/5


Kotlin은 NullPointException을 예방하기 위해 프로퍼티(변수)에 무조건 값을 할당하도록 하였다.

Java의 경우, String name; 으로 선언해도 에러가 발생하지 않는다.
하지만 Kotlin의 경우 var name: String 으로만 선언하면 에러가 발생한다. 아무런 값이 할당되지 않아 null참조 에러가 발생할 수 있기 때문이다.



초기화 블록 선언


class Person {
	// 프로퍼티에 값 할당하지 않고 선언
    var name: String,
    var age: Int
    
    // 초기화 블록 선언
    init {
    	name = "Harry"
        age = 25
    }
}    

클래스 내부에 init 블록을 이용해 값을 선언하면 프로퍼티에 즉시 값을 할당하지 않아도 선언이 가능하다. 초기화 블록은 객체를 생성할 때 가장 먼저 실행된다.



?를 사용해 null 허용으로 선언


var name: String? = null

override fun onCreate() {
	name = "Harry"
}

전역변수로 선언 후 초기화를 나중에 하기 위해 null 값을 지정하였다. 그리고onCreate() 되는 시점에 초기화를 해주고 있다. 무조건적으로 사용하는 객체가 아니라면 초기화를 나중에 해주는 것이다. 그리고 val로는 null로 선언할 수 없다.



lateinit을 사용해 늦은 초기화


lateinit var name: String

override fun onCreate() {
	name = "Harry"
}

전역변수로 선언 후 null 값을 지정하지 않고 lateinit 키워드를 사용한 초기화 방법이다. lateinit의 경우 var 변수만 사용이 가능하고, Primitive Type(Int, Boolean, Double 등)의 자료형에는 사용할 수 없다. 또한, getter와 setter도 사용할 수 없다.



lateinit 키워드를 사용하여 초기화한 경우 안전한 접근을 위해 변수가 초기화 되었는지 확인 후 사용해야 한다. 아래의 코드처럼 ::(더블콜론)을 통해서 isInitialized를 사용해 초기화를 체크한다.

private lateinit var locationListener: LocationListener

if (::locationListener.isInitialized) {
            locationListener = LocationListener()
        }


lazy를 사용해 늦은 초기화


class Person {
	val name: String by lazy {
    	"Harry"
    }
    
    val age: Int by lazy {
    	25
    }
}

// lazy를 사용하면 print 구문에서 프로퍼티가 초기화된다.
fun main(args: Arrys<String>) {
	println("name : ${Person.name}")
    println("age : ${Person.age}")

lazy 키워드를 사용할 경우 var 키워드를 사용할 수 없고 val 키워드를 사용하는 경우에만 가능하다. val 선언 뒤 by lazy {} 블록에서 초기화에 필요한 코드를 작성한다. lateinit과 다르게 선언과 동시에 초기화를 해야 하지만 출력 시점에 초기화가 이루어진다.



0개의 댓글