PHpullh
학습 라이브러리/Kotlin/공변성/반공변성 (Variance)

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 으로 선언한 타입 파라미터를 함수 파라미터에 사용하면 컴파일 오류가 발생합니다. 생산과 소비의 방향을 혼동하지 마세요.