공변성과 반공변성 (컴퓨터 과학)
프로그래밍 언어의 공변성(영어: Covariance)과 반공변성(영어: Contravariance)은 프로그래밍 언어가 타입 생성자(영어: type constructor)에 있어 서브타입을 처리하는 방법을 나타내는 것으로, 더 복잡한 타입간의 서브타입 관계가 타입 사이의 서브타입 관계에 따라 정의되거나, 이를 배반해 정의됨을 가리킨다.
예를 들어, 목록과 함수에 대해 생각해 보자. 고양이
는 동물
의 서브타입이다. 그렇다면 고양이 목록
은 동물 목록
과 어떻게 연관되어야 할까? 또는 고양이
를 인자로 받는 함수가 동물
을 인자로 받는 함수와 어떻게 연관되어야 할까? 이는 변성(영어: Variance)으로 설명될 수 있다. OCaml 언어에서 고양이 목록
은 동물 목록
의 서브타입이다. 목록 타입 생성자가 공변하기 때문이다. 그러나 동물 -> 문자열 함수
는 고양이 -> 문자열 함수
의 서브타입이다. 함수 타입 생성자는 인자 타입에 있어 반공변하기 때문이다.
정의
편집프로그래밍 언어의 자료형 체계에서 I를 타입 매개변수 하나를 받는 타입 생성자라고 할 때,
제네릭에서
편집이 문단은 비어 있습니다. 내용을 추가해 주세요. |
함수 타입에서
편집이 문단은 비어 있습니다. 내용을 추가해 주세요. |
객체 지향 언어의 상속에서
편집서브클래스가 슈퍼클래스의 메소드를 오버라이드 할 경우, 컴파일러는 메소드의 타입이 올바른지 확인해 타입 안전(영어: type safe)을 보장해야만 한다. 무공변만을 허용하는 일부 언어에서는 인자 타입과 반환 타입 모두 슈퍼클래스의 인자 타입 그리고 반환 타입과 정확히 같아야 한다. 그러나 특별한 규칙을 따른다면, 오버라이드된 메소드가 더 유연한 타입을 갖도록 허용하면서도 타입 안전을 보장할 수 있다. 함수 유형에 대한 일반적인 서브타이핑 규칙에 따르면, 오버라이드된 메소드는 더욱 구체적인 타입을 반환해야 하고(반환 타입 공변), 더욱 일반적인 타입을 허용해야만 한다.(인자 타입 반공변)
ClassB가 ClassA를 상속하는 서브클래스라고 할 때, 가능한 조합들을 UML로 나타내면 다음과 같다.
-
함수의 인자/반환 타입과 서브타이핑
-
무공변. 오버라이딩된 메소드의 시그니처는 변하지 않았다. -- 타입 안전하다.
-
공변 반환 타입. 서브타이핑 관계는 CalssA와 ClassB 사이의 관계와 같은 방향이다. -- 타입 안전하다.
-
반공변 인자 타입. 서브타이핑 관계는 ClassA 그리고 ClassB 사이의 관계와 반대 방향이다. -- 타입 안전하다.
-
공변 인자 타입. -- 이 경우에는 타입 안전하지 않다.
객체지향 프로그래밍 언어들의 메소드 오버라이딩 규칙을 요약하면 다음과 같다.
프로그래밍 언어 | 인자 타입 | 반환 타입 |
---|---|---|
C++ (1998년부터), 자바 (J2SE 5.0부터), D | 무공변 | 공변 |
C# | 무공변 | 공변 (C# 9부터 - 이전까지는 무공변) |
Scala | 반공변 | 공변 |
Eiffel | 공변 | 공변 |
같이 보기
편집참조문헌
편집- Castagna, Giuseppe (1995년 5월). “Covariance and contravariance”. 《ACM Transactions on Programming Languages and Systems》 17 (3): 431–447. doi:10.1145/203095.203096. ISSN 0164-0925.