(Kotlin/코틀린) 공변성(out) 완전 정리 - 왜 List 인가?

개요


1. 한줄 정의

out은 “이 타입은 데이터를 내보내기만 한다(Producer)”는 의미입니다.


2. enum은 사실 객체다

open class Animal
class Dog : Animal()

val dogs: List<Dog> = listOf(Dog())
val animals: List<Animal> = dogs // 이게 가능해야 할까?

3. 왜 문제가 되는가?

val animals: MutableList<Animal> = mutableListOf<Dog>()
animals.add(Animal()) // ❌ 문제 발생

4. 그래서 등장한 개념: 공변성 (out)

interface List<out T>

5. out이 있으면 가능한 것

val dogs: List<Dog> = listOf(Dog())
val animals: List<Animal> = dogs // ✅ 가능

6. out의 핵심 규칙

✔ out 타입은 “반환만 가능”

interface Producer<out T> {
    fun produce(): T
}

❌ out 타입은 “파라미터로 사용 불가”

interface Producer<out T> {
    fun consume(value: T) // ❌ 컴파일 에러
}

7. Producer 관점으로 이해하기


8. MutableList는 왜 out이 아닐까?

interface MutableList<T>

fun add(element: T)


Related Posts