상세 컨텐츠

본문 제목

닷넷 4.0 공변성(Covariance)과 반공변성(Contravariance)

.Net Framework/.Net Framework 4.0

by 탑~! 2010. 11. 10. 23:48

본문

닷넷 4.0에서 In, Out 키워드가 추가되었다.

Out 키워드는 공변성을, In 키워드는 반공변성을 나타낸다. 키워드 추가는 기존의 공변성과 반공변성의 모호성을 해결하고 결과물을 쉽게 유추할 수 있게 되었다. 이 키워드들은 제네릭 인터페이스 및 제네릭 델리게이트 이외의 일반 제네릭 매개변수 유형에는 사용할 수 없다.

 

다음은 사전적 의미의 공변성과 반공변성을 그림으로 쉽게 표현해 보았다.

 

[사전적 의미] Covariant : (다른 변인과) 함께 변하는, 공변(共變)하는

사용자 삽입 이미지


 

공변성의 쓰임 : 메서드의 반환형식이 원래 지정된 것보다 더 많은 파생 형식을 사용할 수 있는 기능으로 제네릭 인터페이스 및 델리게이트의 형식매개변수에 대응하는 메서드의 반환형식 또는 읽기 전용 속성에 사용된다.

상속관계가 형성되면 상위형식은 하위형식의 대표가 될 수 있다.

예를 들어 a, b, c T에서 상속되었다면 a(b,c) T형식으로(큰 묶음으로) 분류될 수 있다. 이것을 프로그램 코드로 구현하면 T형식을 담는 변수 P가 등호의 좌변에, 하위의 T형식 개체 a(b,c)를 우변에 두게 된다.  이렇게 되면 a(b,c) P는 공변성을 갖게 된다.

(이 경우 T형식은 a(b,c)뿐 아니라 그들의 자식의 자식들까지도 아우르며 대표가 될 수 있으므로 상속을 통한 출력물의 다양성이 강조되며 이러한 공변성의 쓰임에는 형식 안정성이 요구된다)

 

 

반공변성의 쓰임메서드의 매개변수(인수)형식이 원래 지정된 것보다 더 적은 파생 형식을 사용할 수 있는 기능으로 제네릭 인터페이스 및 델리게이트의 형식매개변수에 대응하는 메서드의 매개변수(인수) 형식 또는 쓰기전용 속성에 사용된다.

 

위에서 예시된 그림에서와 같이 반공변성은 공변성에서 벗어나는 경우 사용되는 용어이다.

일반적으로 메서드의 인수는 다양한 파생된 형식들의 입력 보다는 이들의 대표성을 갖춘 형식으로 입력되고(대표성에 의해 공변성이 발생한다) 특정형식으로 가리킬 경우 이것이 메서드 내에서 안전하게 본래의 형식으로 형변환되어(, 앞의 대표성이 해제되어 반공변성이 된다) 사용된다면 편리한 점이 많이 생기게 된다.

 

이것은 의미상으로 상위형식의 대표성에서 벗어나는 반공변성이 되며 프로그램 코드에서 역상속처럼 보여지게 된다. 다만, 이러한 약속에 동참할 경우....

(이 경우 T형식에서 벗어나서 본래의 형식으로 되돌아와야 하므로 입력의 제한성이 강조되며 이러한 반공변성의 쓰임에는 형식 안정성이 요구된다.)

 

 

 다음은 MS에서 제공하는 도움말을 이해를 돕기위해 그림으로 재구성해 보았다.

사용자 삽입 이미지

<참고자료>

 

http://msdn.microsoft.com/ko-kr/magazine/ee336029.aspx

(Visual Basic 2010의 제네릭 공변성(Covariance) 및 반공변성(Contravariance))

http://msdn.microsoft.com/ko-kr/library/ms173174(VS.80).aspx

(델리게이트의 공변성과 반공변성)

http://msdn.microsoft.com/ko-kr/library/dd799517.aspx

(제네릭의 공변성과 반공변성)

http://msdn.microsoft.com/ko-kr/library/dd233059.aspx
http://msdn.microsoft.com/en-us/library/dd831853.aspx

(2010의 참고 문서)

출처 : http://blog.naver.com/newjava?Redirect=Log&logNo=80115651812
(내용이 좋습니다.)

'.Net Framework > .Net Framework 4.0' 카테고리의 다른 글

[다운로드] Net 4 Update GDR  (0) 2012.03.16
CAS 정책  (0) 2012.02.25
Oracle provider 를 더이상 사용하지 말라?  (0) 2011.08.17
닷넷 컨트롤  (0) 2010.11.10
.NET Framework 4의 보안 변경 내용  (0) 2010.11.10

관련글 더보기