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 |