더북(TheBook)

2.16 변성: 파라미터화한 타입과 하위 타입

변성(variance)은 파라미터화한 타입이 서로 어떤 하위 타입 관계에 있는지 결정하는 방식을 뜻한다. 공변성(covariance)RedColor의 하위 타입일 때 Matcher<Red>Matcher<Color>의 하위 타입이라는 뜻이다. 이런 경우 Matcher<T>는 타입 파라미터 T에 대해 공변성이라고 말한다. 반대로 RedColor의 하위 타입일 때 Matcher<Color>Matcher<Red>의 하위 타입이라면 Matcher<T>는 타입 파라미터 T에 대해 반공변성(contravariant)이라고 말한다.

코틀린에서는 inout이라는 키워드로 변성을 지정한다. inout이 반공변성이나 공변성을 뜻하는 영어 단어보다 더 짧고 이해하기도 쉽다. 아무 키워드도 없으면 무공변성(invariant)이라고 부른다.

List<String>을 생각해 보자. StringAny의 하위 타입이므로 List<String>List<Any>의 하위 타입으로 간주해도 된다는 사실이 명백하다. 자바는 변성을 처리하지 못하므로 이런 경우 와일드카드를 사용해야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.