워크/C# 4.0
공변성과 반공변성 (Covariance and Contravariance)
Dev A.i
2023. 8. 27. 14:46
공변성(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>로 변환하는 것이 가능합니다.
이 예제는 공변성과 반공변성의 기본 개념을 보여줍니다. 실제로 이러한 개념은 제네릭과 타입 시스템의 고급 기능에서 중요한 역할을 합니다.