본문 바로가기
깡샘의 코틀린 프로그래밍 - 루비페이퍼

코틀린 1.2 변경사항 - lateinit

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

 

책에 내용중 1.2 버전에서 lateinit 과 관련되어 변경사항이 있네요.

 

 

8장. 프로퍼티 (페이지 203 )

 

 

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

 

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

 

소스 _ lateinit 사용 에러

 

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 }

 

위의 코드는 07번 줄을 제외하고는 모두 프로퍼티 선언부에 에러가 발생합니다. 먼저 01번 줄은 클래스

멤버가 아닌 최상위 레벨에 선언한 프로퍼티에 lateinit를 추가해서 에러이며 03번 줄은 주 생성자에 추

가해서 에러입니다. 그리고 04번 줄은 val로 선언한 프로퍼티에 lateinit를 추가해서 에러이고, 05번 줄

은 var로 선언했지만, null 허용으로 선언한 프로퍼티에 lateinit를 추가해서 에러가 발생합니다. 또한,

06번 줄은 기초 타입인 Int로 선언한 프로퍼티에 lateinit를 추가해서 에러가 발생합니다.

 

위의 내용을 아래처럼 변경합니다.

 

 

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

 

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

소스 _ lateinit 사용 에러

 

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를 추가해서 에러가 발생합니다.

 

 
 
8장. 프로퍼티 (페이지 205 )
 
위의 소스에서는 여러 군데서 lazy를 사용했습니다. 우선 03번 줄을 보면 someData라는 프로퍼티를
선언하고 lazy로 초기화했습니다. 그런데 03번 줄의 someData는 클래스의 멤버가 아니라 최상위 레벨
에 선언한 프로퍼티입니다. 앞서 살펴본 lateinit는 최상위 레벨에 선언한 프로퍼티에 사용할 수 없었지
만, lazy는 가능합니다. 그리고 lazy 영역이 실행되는 시점은 실제 이 프로퍼티가 사용되는 시점입니다.
위의 소스에서는 someData 프로퍼티를 어디서도 사용하지 않았으므로 03번 줄의 lazy 영역은 한 번도
실행되지 않습니다.
 
 

아래로 변경합니다.

 

위의 소스에서는 여러 군데서 lazy를 사용했습니다. 우선 03번 줄을 보면 someData라는 프로퍼티를

선언하고 lazy로 초기화했습니다. 그런데 03번 줄의 someData는 클래스의 멤버가 아니라 최상위 레벨

에 선언한 프로퍼티입니다. 그리고 lazy 영역이 실행되는 시점은 실제 이 프로퍼티가 사용되는 시점입니다.

위의 소스에서는 someData 프로퍼티를 어디서도 사용하지 않았으므로 03번 줄의 lazy 영역은 한 번도

실행되지 않습니다.