2.16 변성: 파라미터화한 타입과 하위 타입
변성(variance)은 파라미터화한 타입이 서로 어떤 하위 타입 관계에 있는지 결정하는 방식을 뜻한다. 공변성(covariance)은 Red가 Color의 하위 타입일 때 Matcher<Red>가 Matcher<Color>의 하위 타입이라는 뜻이다. 이런 경우 Matcher<T>는 타입 파라미터 T에 대해 공변성이라고 말한다. 반대로 Red가 Color의 하위 타입일 때 Matcher<Color>가 Matcher<Red>의 하위 타입이라면 Matcher<T>는 타입 파라미터 T에 대해 반공변성(contravariant)이라고 말한다.
코틀린에서는 in과 out이라는 키워드로 변성을 지정한다. in과 out이 반공변성이나 공변성을 뜻하는 영어 단어보다 더 짧고 이해하기도 쉽다. 아무 키워드도 없으면 무공변성(invariant)이라고 부른다.
List<String>을 생각해 보자. String은 Any의 하위 타입이므로 List<String>을 List<Any>의 하위 타입으로 간주해도 된다는 사실이 명백하다. 자바는 변성을 처리하지 못하므로 이런 경우 와일드카드를 사용해야 한다.