더북(TheBook)

2.16.1 변성이 문제인 이유

String의 인스턴스는 Any의 인스턴스이기도 하다. 따라서 다음과 같이 쓸 수 있다.

val s = "A String"
val a: Any = s

AnyString의 부모 타입이라서 이렇게 쓸 수 있다. 만약 MutableList<Any>MutableList<String>의 부모 타입이라면 다음과 같이 쓸 수 있다.

val ls = mutableListOf("A String")
val la: MutableList<Any> = ls // <-- 컴파일 오류
la.add(42)

이 코드를 컴파일할 수 있다면 문자열 리스트에 Int를 집어넣을 수 있다. 불변 리스트를 사용할 때는 이런 일이 크게 문제가 되지 않는다. 문자열로 이뤄진 불변 리스트에 Int 타입의 원소를 추가하면 List<Any> 타입의 리스트가 새로 생기고, 원래 리스트는 변하지 않는다.

val ls = listOf("A String")
val la = ls + 42 // <-- 코틀린은 `la`의 타입을 `List<Any>`로 추론함
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.