본문 바로가기

워크/C# 4.0

공변성과 반공변성 (Covariance and Contravariance)

공변성(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) { }
    }
}

위 예제에서:

  1. IEnumerable<T> 인터페이스는 공변적입니다. 따라서 IEnumerable<Mammal>은 IEnumerable<Animal>로 안전하게 변환될 수 있습니다.
  2. Action<T> 대리자는 반공변적입니다. 그래서 Action<Animal>을 Action<Cat>로 변환하는 것이 가능합니다.

이 예제는 공변성과 반공변성의 기본 개념을 보여줍니다. 실제로 이러한 개념은 제네릭과 타입 시스템의 고급 기능에서 중요한 역할을 합니다.