공변성(covariance)과 반공변성(contravariance)은 C#에서 제네릭 인터페이스와 대리자와 관련된 고급 개념입니다. 이를 이해하려면 먼저 공변성과 반공변성의 정의부터 알아보겠습니다.
- 공변성(Covariance): 서브타입의 결과를 반환하거나 얻을 수 있을 때 사용합니다. C#에서는 out 키워드로 표시됩니다.
- 반공변성(Contravariance): 수퍼타입의 입력을 받을 수 있을 때 사용합니다. C#에서는 in 키워드로 표시됩니다.
이제 간단한 예제를 통해 이 두 개념을 살펴보겠습니다.
using System;
using System.Collections.Generic;
namespace CovarianceAndContravarianceExample
{
class Animal { }
class Mammal : Animal { }
class Cat : Mammal { }
class Program
{
static void Main()
{
// 공변성 예제: IEnumerable<out T> 인터페이스는 공변적입니다.
IEnumerable<Mammal> mammals = new List<Mammal>();
IEnumerable<Animal> animals = mammals; // 공변성
// 반공변성 예제: Action<in T> 대리자는 반공변적입니다.
Action<Animal> animalAction = AnimalMethod;
Action<Cat> catAction = animalAction; // 반공변성
}
static void AnimalMethod(Animal a) { }
}
}
위 예제에서:
- IEnumerable<T> 인터페이스는 공변적입니다. 따라서 IEnumerable<Mammal>은 IEnumerable<Animal>로 안전하게 변환될 수 있습니다.
- Action<T> 대리자는 반공변적입니다. 그래서 Action<Animal>을 Action<Cat>로 변환하는 것이 가능합니다.
이 예제는 공변성과 반공변성의 기본 개념을 보여줍니다. 실제로 이러한 개념은 제네릭과 타입 시스템의 고급 기능에서 중요한 역할을 합니다.
'워크 > C# 4.0' 카테고리의 다른 글
임베디드 Interop 형식 (Embedded Interop Types) (0) | 2023.08.27 |
---|---|
COM Interop 개선사항 (0) | 2023.08.27 |
옵션 매개변수 (Optional Parameters) (0) | 2023.08.27 |
명명된 매개변수 (Named Parameters) (0) | 2023.08.27 |
동적 바인딩 (Dynamic Binding) (0) | 2023.08.27 |