Study(종료)/Kotlin 22.09.13 ~ 12.18

5-3. 고급 함수와 함수형 프로그래밍 활용하기 : 확장 프로퍼티

Ski_ 2022. 10. 8. 23:42

5장

5-1. 고급 함수와 함수형 프로그래밍 활용하기 : 코틀린을 활용한 함수형 프로그래밍

5-2. 고급 함수와 함수형 프로그래밍 활용하기 : 확장

5-3. 고급 함수와 함수형 프로그래밍 활용하기 : 확장 프로퍼티

5-4. 고급 함수와 함수형 프로그래밍 활용하기 : 동반 확장

5-5. 고급 함수와 함수형 프로그래밍 활용하기: 수신 객체가 있는 호출 가능 참조


5-3. 확장 프로퍼티

 

1) 확장 프로퍼티

앞에서 사용했던 확장 함수와 비슷하게 확장 프로퍼티 역시 정의할 수 있다.

다른 일반 멤버 프로퍼티와 동일한 방법으로 확장 프로퍼티에 접근할 수 있으며 문법도 비슷하다.

val IntRange.leftHalf: IntRange
    get() = start..(start + endInclusive)/2

fun main() {
    println((11..33).leftHalf) // 11..22
    println((33..66).leftHalf) // 33..49
}

멤버 프로퍼티와 확장 프로퍼티의 가장 큰 차이는 어떤 클래스의 인스턴스에 안정적으로 상태를 추가할 방법이 없기 때문에backing-field를 쓸 수 없다는 점이다. 즉 확장 프로퍼티를 초기화할 수 없으며 접근자 안에서 field를 사용할 수도 없고,lateinit을 이용해 확장 프로퍼티를 정의할 수 없다(lateinit은 backing-field에 의존하는 기능이므로)

위와 같은 이유로 확장 프로퍼티 정의에서는 항상 명시적인 게터를 정의해야 하고,

가변 프로퍼티의 경우 세터도 명시해야 한다.

val IntArray.midIndex
    get() = lastIndex/2

var IntArray.midValue
    get() = this[midIndex]
    set(value){
        this[midIndex] = value
    }

fun main() {
    val numbers = IntArray(6) {it * it * it} // 0, 1, 8, 27, 64, 125
    println(numbers.midValue) // 8
    numbers.midValue *= numbers.midValue // 8 * 8
    println(numbers.midValue) // 64
}

다음글

5-4. 고급 함수와 함수형 프로그래밍 활용하기 : 동반 확장

반응형