KOTLIN · 객체지향
공변성/반공변성 (Variance)
out(공변성)과 in(반공변성)으로 제네릭 타입의 상하위 관계를 제어합니다.
객체지향고급variancecovariancecontravarianceoutin
핵심 설명
out(공변성)과 in(반공변성)으로 제네릭 타입의 상하위 관계를 제어합니다.
Kotlin code
// out: 생산만 (공변성) - 읽기 전용
interface Producer<out T> {
fun produce(): T
}
// in: 소비만 (반공변성) - 쓰기 전용
interface Consumer<in T> {
fun consume(item: T)
}
open class Animal(val name: String)
class Dog(name: String) : Animal(name)
class Cat(name: String) : Animal(name)
class DogProducer : Producer<Dog> {
override fun produce() = Dog("멍이")
}
class AnimalConsumer : Consumer<Animal> {
override fun consume(item: Animal) {
println("처리: ${item.name}")
}
}
fun feedAnimal(producer: Producer<Animal>, consumer: Consumer<Dog>) {
val animal = producer.produce()
// consumer.consume(Dog("바둑이"))
println("동물: ${animal.name}")
}
fun main() {
val dogProducer: Producer<Dog> = DogProducer()
// Producer<Dog>을 Producer<Animal>로 사용 가능 (out)
val animalProducer: Producer<Animal> = dogProducer
println(animalProducer.produce().name)
// Consumer<Animal>을 Consumer<Dog>로 사용 가능 (in)
val animalConsumer: Consumer<Animal> = AnimalConsumer()
val dogConsumer: Consumer<Dog> = animalConsumer
dogConsumer.consume(Dog("바둑이"))
}학습 팁
out T는 "T를 생산만 한다"(반환만), in T는 "T를 소비만 한다"(파라미터로만)는 의미입니다.
주의할 점
out으로 선언한 타입 파라미터를 함수 파라미터에 사용하면 컴파일 오류가 발생합니다. 생산과 소비의 방향을 혼동하지 마세요.
자주 묻는 질문
공변성/반공변성 (Variance)란 무엇인가요?
out (공변성)과 in (반공변성)으로 제네릭 타입의 상하위 관계를 제어합니다.
공변성/반공변성 (Variance) 학습 시 주의할 점은 무엇인가요?
out 으로 선언한 타입 파라미터를 함수 파라미터에 사용하면 컴파일 오류가 발생합니다. 생산과 소비의 방향을 혼동하지 마세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.