모바일

[kotlin] 공변성과 반공변성

Patti Smith 2024. 8. 29.
공변성(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라는 더 좁은 타입을 다룰 수 있게 되는 것이다.

댓글