본문 바로가기
Kotlin

[깡샘의 코틀린 프로그래밍] 정리 8 - lateinit

by 들풀민들레 2018. 3. 2.

 

본 글은 [깡샘의 코틀린 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

 

8장. 프로퍼티 (Property)

 

8.2.3. 늦은 초기화 lateinit

 

앞 절에서 프로퍼티를 명시적으로 null 허용으로 선언하고 이후 값을 대입해 사용하는 방법을 알아보았습니다. 그런데 프로퍼티를 null 허용으로 선언하지 않고 프로퍼티 초기화를 미루는 방법도 있습니다. 이 방법은 lateinit 예약어를 이용하며, '늦은 초기화'라고 부릅니다.

 

01 package eight_two_three

02

03 class User1 {

04   lateinit var lateData: String

05 }

06

07 fun main(args: Array<String>) {

08   // lateinit

09   val user = User1()

10   user.lateData = "hello"

11   println(user.lateData)

12 }

 

위의 코드를 보면 04번 줄에서 lateData라는 이름으로 문자열 프로퍼티를 선언했습니다. 그런데 프로퍼티를 선언하면서 초깃값을 설정하지 않았으며 대신 lateinit을 명시했습니다. 그다음 10번 줄에서 프로퍼티 값을 초기화해서 사용했습니다. 이처럼 늦은 초기화를 이용하면 프로퍼티의 선언과 동시에 초기화하지 않아도 됩니다.

 

그런데 늦은 초기화는 사용 시 주의할 점이 많습니다. 다음과 같은 제약이 있습니다.

 

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

 

01 lateinit var data1: String //성공

02

03 class User2(lateinit var data: String) { //에러

04   lateinit val data2: String //에러

05   lateinit var data3: String? //에러

06   lateinit var data4: Int //에러

07   lateinit var data5: String //성공

08 }

 

03번 줄은 주 생성자에 추가해서 에러입니다. 그리고 04번 줄은 val로 선언한 프로퍼티에 lateinit를 추가해서 에러이고, 05번 줄은 var로 선언했지만, null 허용으로 선언한 프로퍼티에 lateinit를 추가해서 에러가 발생합니다. 또한, 06번 줄은 기초 타입인 Int로 선언한 프로퍼티에 lateinit를 추가해서 에러가 발생합니다.