공변성(Covariance)?
타입 A`가 타입 A의 하위 타입이라면, 제네릭 타입 T<A`>가 T<A>의 하위 타입이 되는 것을 발한다. out keyword를 사용하여 공변성을 표현한다.
class Box<out T>(val value: T) {
// code
}
val dogBox: Box<Dog> = Box(Dog())
val animal: Box<Animal> = dogBox
dog는 Animal의 하위 타입이다. 공변성을 나타내는 out키워드를 통해 Box<Dog> 역시 Box<Animal>에 타입캐스팅할 수 있다.
반공변성(Contravariance)
타입 A`가 타입 A의 하위 타입이라면 제네릭 타입 T<A>이 T<A`>의 하위 타입이 되는 관계를 의미한다. 그리고 이 규칙이 매개변수로 전달된다면 이 동작이 반대로 작용한다.
interface Comparable<in T> {
fun compareTo(other: T): Int
}
fun sortAnimals(comparator: Comparable<Animal>) {
// code
}
class AnimalComparator : Comparable<Animal> {
override fun compareTo(other: Animal) : Int = 0
}
val dogComparator: Comparable<Dog> = AnimalComparator()
sortAnimals(dogComparator)
Comparable<Animal>은 Comparable<Dog>의 상위 타입이다. 그리고 dogComparator은Comparable<Dog> 타입이나, Comparable<Animal>을 기대하는 sortAnimals함수에 전달 할 수 있다. in 키워드는 타입 파라미터가 함수의 매개변수 위치에서 사용될 때 유용하며 이는 구체적인 타입인 Dog를 다루는 비교자를 더 일반적인 타입인 Animal을 다루는 함수에 전달할 수 있게 한다. 다시 말해, Animal이라는 넓은 타입을 다룰 수 있지만 하위 타입으로 들어가 Dog라는 더 좁은 타입을 다룰 수 있게 되는 것이다.
'모바일' 카테고리의 다른 글
[kotlin] 함수 참조 :: 더블 콜론 (0) | 2024.10.22 |
---|---|
테일러 스위프트 상점 페이지 크롤링하는 어플리케이션 만들기 - (1) (2) | 2024.07.25 |
깃헙 액션으로 디스코드에 apk파일 보내기(feat. git tag) (0) | 2024.07.21 |
깃헙액션으로 플레이 스토어에 어플 자동 빌드 및 배포하는 법 (0) | 2024.07.21 |
play store : java keystore로 google에서 제공하는 key대신 보유 key 업로드하는 방법 (0) | 2024.06.20 |
댓글