본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 42] 확장 프로퍼티

확장 함수 정의처럼
확장 프로퍼티도 정의할 수 있다?

 

 

확장 함수를 정의했던 것처럼 확장 프로퍼티의 수신 객체 타입을 지정하는 것도 가능한데,

이는 확장 함수를 정의하는 방법과 비슷하다.

오늘은 확장 프로퍼티를 정의하는 방법에 대해 학습하는 아톰이다.

 


 

[ 확장 프로퍼티 ]

확장 프로퍼티

: 확장 대상 타입을 함수나 프로퍼티 이름 바로 앞에 작성

: 커스텀 게터가 필요하며, 프로퍼티에 접근할 때마다 프로퍼티 값이 계산됨

: 파라미터가 없는 확장 함수는 항상 확장 프로퍼티로 변환이 가능하지만 변환 이전에 생각하는 것을 권장

: 기능이 단순하고 가독성을 향상시키는 경우에만 프로퍼티를 권장

 

fun ReceiverType.extensionFunction() { ... }
val ReceiverType.extensionproperty: PropType
	get(){...}

 


 

[ 제네릭 확장 프로퍼티 ]

 

import atomictest.eq

val <T> List<T>.firstOrNull: T?
	get() = if (isEmpty()) null else this[0]
    
fun main() {
	listOf(1, 2, 3).firstOrNull eq 1
    listOf<String>().firstOrNull eq null
)

 

: 제네릭 인자 타입을 사용하지 않으면 *로 대신할 수 있음 (스타 프로젝션)

 

import atomictest.eq

val List<*>.indices : IntRange
	get() = 0 until size
    
fun main() {
	listOf(1).indices eq 0..0
	listOf('a', 'b', 'c', 'd').indices eq 0..3
    emptyList<Int>().indices eq IntRange.EMPTY
}

 

: List<*>를 사용하면 List에 담긴 원소의 타입 정보를 모두 잃어버림

: List<*>에서 얻은 원소는 Any? 타입에만 대입 가능