본문 바로가기

워크/C# 2.0

Covariance와 Contravariance

C#에서의 공변성(Covariance) 및 반공변성(Contravariance)은 인터페이스 및 델리게이트를 사용할 때 타입 변환의 안정성을 허용하는 방식입니다.

Covariance (공변성)

공변성은 변환된 타입에서 원래 타입으로의 일방향 변환을 허용합니다. 예를 들어, IEnumerable<Derived>는 IEnumerable<Base>로 안전하게 변환될 수 있습니다.

using System;
using System.Collections.Generic;

class Base { }
class Derived : Base { }

public class CovarianceExample
{
    public static void Main()
    {
        List<Derived> derivedList = new List<Derived>();
        IEnumerable<Base> bases = derivedList; // 공변성을 통한 변환

        Console.WriteLine("Converted List<Derived> to IEnumerable<Base>");
    }
}

Contravariance (반공변성)

반공변성은 원래 타입에서 변환된 타입으로의 일방향 변환을 허용합니다. 예를 들어, Action<Base>는 Action<Derived>로 안전하게 변환될 수 있습니다.

using System;

class Base { }
class Derived : Base { }

public class ContravarianceExample
{
    public static void ActionOnBase(Base b) { }

    public static void Main()
    {
        Action<Derived> derivedAction = ActionOnBase; // 반공변성을 통한 변환

        Derived d = new Derived();
        derivedAction(d); // ActionOnBase 메서드가 호출됨

        Console.WriteLine("Called ActionOnBase using an Action<Derived>");
    }
}

이 예제에서, 공변성은 List<Derived>를 IEnumerable<Base>로 변환할 수 있음을 보여줍니다. 반면, 반공변성은 Action<Base>를 Action<Derived>로 변환할 수 있음을 보여줍니다.

공변성과 반공변성의 개념은 더 복잡한 시나리오에서 유용합니다. 특히, C# 4.0 이후로 이러한 기능은 제네릭 인터페이스 및 델리게이트에서 사용될 수 있게 되었고, LINQ 및 다른 고급 기능에서도 중요한 역할을 합니다.

'워크 > C# 2.0' 카테고리의 다른 글

부분 타입 (Partial Types)  (0) 2023.08.25
고정 크기 버퍼 (Fixed Size Buffers)  (0) 2023.08.25
반복자 (Iterators)  (0) 2023.08.25
익명 메서드 (Anonymous Methods)  (0) 2023.08.25
Nullable 타입  (0) 2023.08.25