변성(variance)은 타입 생성자1에서 기본 타입과 하위 타입 간의 할당 가능성을 설명한다.

ArrayList<Dog>ArrayList<Animal>는 어떤 관계인가? — “Java에서 두 타입은 기본적으로 무공변 관계에 있다.”

변성의 종류

변성은 네 종류로 분류할 수 있다. 타입 A가 타입 B의 하위 타입(A ⊆ B)이고, 타입 생성자 T가 존재할 때 네 가지 종류의 변성을 다음과 같이 설명할 수 있다.

  1. 공변(covariant): T<A>를 T<B>에 할당할 수 있다.
  2. 반공변(contravariant): T<B>를 T<A>에 할당할 수 있다.
  3. 이변(bivariant): T<A>와 T<B>는 상호 할당 가능하다.
  4. 무공변(invariant): T<A>와 T<B>는 상호 할당할 수 없다.

참고 문헌

Footnotes

  1. 새로운 타입을 만들어내는 틀이다. 예를 들어 ArrayList<T>에서 ArrayList는 타입 매개변수 T에 구체적인 타입을 할당하여 ArrayList<Dog>, ArrayList<Car> 등의 구체적인 타입을 만들어 내는 타입 생성자다.