Kotlin

코틀린 lateinit과 by lazy

SKaSha 2019. 7. 23. 00:56

코틀린은 null 처리가 매우 엄격한데, null이 사용되지 않는 프로퍼티에 초기화 시점을 미룸으로써 null 허용으로 선언할 필요가 없습니다.

lateinit

class User {
    lateinit var lateData: String
}

fun main(args: Array<String>) { 
    val user = User()
    user.lateData = "hello world"
    println(user.lateData)
}

실행결과
hello world

사용 규칙

  • var로 선언한 프로퍼티에만 사용할 수 있다.
  • 클래스 몸체에 선언한 프로퍼티에만 사용할 수 있다. 주 생성자에는 사용할 수 없다.
  • 사용자 정의 getter/setter를 사용하지 않은 프로퍼티에만 사용할 수 있다.
  • null 허용 프로퍼티에는 사용할 수 없다.
  • 기초 타입 프로퍼티에는 사용할 수 없다.

by lazy

초기화를 늦게하는 Delegated 프로퍼티로써, 프로퍼티에 대한 getter/setter를 위임하여 위임받은 객체로 명령을 수행한다.

class User {
    val name: String by lazy {
        println("return name lazy")
        "Lazy"
    }

    val age: Int by lazy {
        println("return age lazy")
        27
    }

    init {
        println("user init")
    }
    constructor() {
        println("user sub constructor")
    }
}

fun main(args: Array<String>) { 
    val user = User()
    println("name : ${user.name}")
    println("age : ${user.age}")
}

실행결과
user init
user sub constructor
return name lazy
name : Lazy
return age lazy
age : 27

사용 규칙

  • 호출 시점에 초기화 진행.
  • val로 선언한 프로퍼티에만 사용 가능
  • 클래스 몸체 이외에 최상위 레벨에서 사용 가능
  • 기초 타입에도 사용 가능