티스토리 뷰
728x90
- 늦은 초기화 (lateinit)
- 인스턴스를 생성할 때 프로퍼티를 초기화하지 않고, 필요시 초기화하기 위해 사용한다.
- 값을 읽을 때 프로퍼티가 초기화되지 않으면 UninitializedPropertyAccessException 예외를 던진다.
- lateinit 프로퍼티의 조건
- 가변 프로퍼티로 정의해야 한다.
- 참조 타입, non-nullable type이어야 한다. (내부에서는 초기화되지 않은 상태를 표현하기 위해 널을 사용하기 때문)
- 선언과 동시에 초기화할 수 없다.
- 최상위 프로퍼티와 지역 변수에서도 사용할 수 있다.
2. 커스텀 접근자
- 프로퍼티는 커스텀 접근자를 통해 변수와 함수의 동작을 하나의 선언에 조합할 수 있다.
- 커스텀 접근자는 프로퍼티 값을 읽거나 쓸 때 호출되는 함수다.
- 커스텀 게터
class Person(val firstName: String, val familyName: String) {
val fullName: String
get(): String { // get() = "$firstName $familyName"
return "$firstName $familyName"
}
}
- 프로퍼티를 읽으면 자동으로 게터를 호출한다.
- 파라미터가 없으며 반환 타입은 프로퍼티의 타입과 같아야 한다.
- 프로퍼티를 읽을 때마다 다시 계산된다.
- 위의 게터처럼, 계산에 의해 값을 돌려주는 프로퍼티의 경우 뒷받침하는 필드가 존재하지 않는다.
- 뒷받침하는 필드 (backing field)
- 프로퍼티의 값을 저장하고 있는 필드를 뜻한다.
- 하나 이상의 디폴트 접근자를 사용하거나 커스텀 접근자에서 field 키워드를 사용하면 생성된다.
- 프로퍼티를 초기화하는 경우 뒷받침하는 필드에 직접 대입된다.
- 접근자의 본문 내에서만 쓸 수 있다.
- 뒷받침하는 필드 (backing field)
- 커스텀 세터
class Person(val firstName: String, val familyName: String) {
var age: Int = 0
set(value) {
field = value
}
}
fun main() {
val person = Person("John", "Doe")
person.age = 20 // 커스텀 세터 호출
println(person.age) // 20 (디폴트 게터 호출)
}
- 가변 프로퍼티에는 게터와 세터 두가지 접근자를 선언할 수 있다.
- 하나의 파라미터를 가지며, 프로퍼티의 타입과 같아야 한다.
- 커스텀 게터/세터에 접근 제한자를 붙일 수 있다.
- 기본 구현을 변경하지 않고 접근 제한자만 필요한 경우 get, set 키워드만 사용하여 정의할 수 있다.
- ex) private set
- lateinit 프로퍼티는 항상 자동으로 접근자가 생성되기 때문에 커스텀 접근자를 정의할 수 없다.
- 주생성자 파라미터의 프로퍼티도 커스텀 접근자를 정의할 수 없다.
3. 지연 계산 프로퍼티
val text by lazy {
"Hello"
}
fun main() {
println(text)
}
- 프로그램이 시작될 때 초기화되지 않고, 처음으로 lazy 프로퍼티의 값을 읽을 때 초기화된다. 그 이후는 저장된 값을 읽는다.
- lazy 블록 안에는 프로퍼티를 초기화하는 코드를 지정한다.
- 초기화 후에 변경되지 않는 불변 프로퍼티다.
- by 키워드를 통한 위임 프로퍼티다.
728x90
'app > kotlin' 카테고리의 다른 글
[kotlin/코틀린] 고차 함수 (0) | 2023.07.19 |
---|---|
[kotlin/코틀린] 객체 (0) | 2023.06.22 |
[kotlin/코틀린] 널 가능성 (0) | 2023.06.22 |
[kotlin/코틀린] 클래스 정의하기 (0) | 2023.06.22 |
[kotlin/코틀린] 기초 문법 (문자열, 배열, 함수) (0) | 2023.06.22 |