책에 내용중 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를 추가해서 에러가 발생합니다.
위의 소스에서는 여러 군데서 lazy를 사용했습니다. 우선 03번 줄을 보면 someData라는 프로퍼티를선언하고 lazy로 초기화했습니다. 그런데 03번 줄의 someData는 클래스의 멤버가 아니라 최상위 레벨에 선언한 프로퍼티입니다. 앞서 살펴본 lateinit는 최상위 레벨에 선언한 프로퍼티에 사용할 수 없었지만, lazy는 가능합니다. 그리고 lazy 영역이 실행되는 시점은 실제 이 프로퍼티가 사용되는 시점입니다.위의 소스에서는 someData 프로퍼티를 어디서도 사용하지 않았으므로 03번 줄의 lazy 영역은 한 번도실행되지 않습니다.
아래로 변경합니다.
위의 소스에서는 여러 군데서 lazy를 사용했습니다. 우선 03번 줄을 보면 someData라는 프로퍼티를
선언하고 lazy로 초기화했습니다. 그런데 03번 줄의 someData는 클래스의 멤버가 아니라 최상위 레벨
에 선언한 프로퍼티입니다. 그리고 lazy 영역이 실행되는 시점은 실제 이 프로퍼티가 사용되는 시점입니다.
위의 소스에서는 someData 프로퍼티를 어디서도 사용하지 않았으므로 03번 줄의 lazy 영역은 한 번도
실행되지 않습니다.
'깡샘의 코틀린 프로그래밍 - 루비페이퍼' 카테고리의 다른 글
오타 신고 및 책에 대한 문의 (2) | 2018.01.15 |
---|---|
책 PDF 자료 (0) | 2018.01.15 |
책에 담긴 실습 코드 (0) | 2018.01.15 |
Step by Step 실습 - 공유 파일 (0) | 2018.01.15 |