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

위키백과, 우리 모두의 백과사전.

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

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

정의[편집]

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

  • 공변(영어: Covariance)할 때, ST의 서브타입이라면(), 의 서브타입이다. ()
  • 반공변(영어: Contravariance)할 때, ST의 서브타입이라면(), 의 서브타입이다. ()
  • 이변(영어: Bivariance)할 때, 공변하면서도 반공변한다.
  • 무공변(영어: Invariant)하다면 공변하지도 반공변하지도 않는다.

제네릭에서[편집]

함수 타입에서[편집]

객체 지향 언어의 상속에서[편집]

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

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

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

프로그래밍 언어 인자 타입 반환 타입
C++ (1998년부터), 자바 (J2SE 5.0부터), D 무공변 공변
C# 무공변 공변 (C# 9부터 - 이전까지는 무공변)
Scala 반공변 공변
Eiffel 공변 공변

같이 보기[편집]

참조문헌[편집]