공변성과 반공변성 (컴퓨터 과학)

프로그래밍 언어의 공변성()과 반공변성()은 프로그래밍 언어가 타입 생성자()에 있어 서브타입을 처리하는 방법을 나타내는 것으로, 더 복잡한 타입간의 서브타입 관계가 타입 사이의 서브타입 관계에 따라 정의되거나, 이를 배반해 정의됨을 가리킨다.

예를 들어, 목록과 함수에 대해 생각해 보자. 는 의 서브타입이다. 그렇다면 은 과 어떻게 연관되어야 할까? 또는 를 인자로 받는 함수가 을 인자로 받는 함수와 어떻게 연관되어야 할까? 이는 변성()으로 설명될 수 있다. OCaml 언어에서 은 의 서브타입이다. 목록 타입 생성자가 공변하기 때문이다. 그러나 는 의 서브타입이다. 함수 타입 생성자는 인자 타입에 있어 반공변하기 때문이다.

정의 
프로그래밍 언어의 자료형 체계에서 를 타입 매개변수 하나를 받는 타입 생성자라고 할 때,

 공변()할 때, 가 의 서브타입이라면(), 는 의 서브타입이다. ()
 반공변()할 때, 가 의 서브타입이라면(), 는 의 서브타입이다. ()
 이변()할 때, 공변하면서도 반공변한다.
 무공변()하다면 공변하지도 반공변하지도 않는다.

제네릭에서

함수 타입에서

객체 지향 언어의 상속에서 
서브클래스가 슈퍼클래스의 메소드를 오버라이드 할 경우, 컴파일러는 메소드의 타입이 올바른지 확인해 타입 안전()을 보장해야만 한다. 무공변만을 허용하는 일부 언어에서는 인자 타입과 반환 타입 모두 슈퍼클래스의 인자 타입 그리고 반환 타입과 정확히 같아야 한다. 그러나 특별한 규칙을 따른다면, 오버라이드된 메소드가 더 유연한 타입을 갖도록 허용하면서도 타입 안전을 보장할 수 있다. 함수 유형에 대한 일반적인 서브타이핑 규칙에 따르면, 오버라이드된 메소드는 더욱 구체적인 타입을 반환해야 하고(반환 타입 공변), 더욱 일반적인 타입을 허용해야만 한다.(인자 타입 반공변)

ClassB가 ClassA를 상속하는 서브클래스라고 할 때, 가능한 조합들을 UML로 나타내면 다음과 같다.

객체지향 프로그래밍 언어들의 메소드 오버라이딩 규칙을 요약하면 다음과 같다.

같이 보기 
 리스코프 치환 원칙
 다형성 (컴퓨터 과학)
 상속 (객체 지향 프로그래밍)

참조문헌 

 

다형성 (컴퓨터 과학)
유형 이론
객체 지향 프로그래밍
함수형 프로그래밍
제네릭 프로그래밍