Property
최상위 프로퍼티
- 클래스나 함수와 마찬가지로 최상위 수준에 프로퍼티를 정의할 수도 있다.
늦은 초기화
- 프로퍼티를 최대한 늦게, 효율적으로 초기화 해야할 수도 있다. 의존 관계 주입 등과 같이 말이다.
- 이 경우 default 값을 주고 늦게 초기화할 수도 있다.
lateinit이라는 키워드로 이를 알린다.- 프로퍼티가 코드에 따라서 변경되어야 하므로
var로 선언한다. - NonNullType이어야 한다.
- Int, Boolean 같은 원시 타입이 아니어야 한다. (초기화 되어 있지 않음을 표시하기 위해서 Null을 사용해야 한다.)
- 프로퍼티가 코드에 따라서 변경되어야 하므로
커스텀 접근자 사용하기
- kotlin 프로퍼티는 변수와 함수의 동작을 한 선언 안에서 조합할 수 있다는 것에 있다.
- 참고로 Swift의 get/set과 같다.
var _name var fullName: String { get { return _name } set(val) { self._name = val } }```kotlin var hello: String = “world” public get() = “Hello $field” protected set(value) {field = value.replace(“Hello “, “”)}
var age: Int = 20 get() = field * 10 private set
- 내부에서 `field`라는 키워드로 필드 참조가 가능하다.
- 사용하는 경우는
1. 예외 가능성이 없거나
2. 계산 비용이 싸거나
3. 값을 캐시해두거나
4. 여러 번 읽거나
5. 함수를 호출해도 같은 결과를 내는 경우
- 참고로 `lateinit`은 항상 자동으로 접근자가 생성되므로 직접 커스텀 접근자를 정의할 수 없다.
- 주생성자, 파라미터로 선언된 프로퍼티에 대한 접근자도 지원하지 않는다.
## 지연 계산 프로퍼티
- 지연 + 계산 프로퍼티를 쓰고 싶을 수 있다.
- 이 경우 `lazy` 프로퍼티를 이용하면 된다.
```kotlin
import java.io.File
val text by lazy {
File("data.txt").readText();
}
- 위 구문은 실질적으로는
delegateObject를 이용해서 구현하는 위임 프로퍼티라는 경우다.