확장 함수 정의처럼
확장 프로퍼티도 정의할 수 있다?
확장 함수를 정의했던 것처럼 확장 프로퍼티의 수신 객체 타입을 지정하는 것도 가능한데,
이는 확장 함수를 정의하는 방법과 비슷하다.
오늘은 확장 프로퍼티를 정의하는 방법에 대해 학습하는 아톰이다.
[ 확장 프로퍼티 ]
확장 프로퍼티
: 확장 대상 타입을 함수나 프로퍼티 이름 바로 앞에 작성
: 커스텀 게터가 필요하며, 프로퍼티에 접근할 때마다 프로퍼티 값이 계산됨
: 파라미터가 없는 확장 함수는 항상 확장 프로퍼티로 변환이 가능하지만 변환 이전에 생각하는 것을 권장
: 기능이 단순하고 가독성을 향상시키는 경우에만 프로퍼티를 권장
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? 타입에만 대입 가능
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
[Atomic 44] 람다 (0) | 2024.02.21 |
---|---|
[Atomic 43] break와 continue (3) | 2024.02.21 |
[Atomic 41] 제네릭스 소개 (0) | 2024.02.21 |
[Atomic 40] 확장 함수와 널이 될 수 있는 타입(라이브러리 함수) (0) | 2024.02.20 |
[Atomic 39] 널 아님 단언 (0) | 2024.02.20 |