Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 공변성(Covariance)과 반공변성(Contravariance) 쉽게 이해하기

C#에서 클래스를 더 유연하고 효율적으로 다루려면 공변성(Covariance)반공변성(Contravariance) 개념을 반드시 이해해야 합니다. 이 두 개념은 상속 관계에 있는 타입 간의 변환 규칙을 정의하며, 배열·인터페이스·델리게이트 등 다양한 곳에서 활용됩니다.

예제 클래스 구조

설명을 위해 세 개의 클래스를 준비합니다. OneTwo의 기본 클래스이고, Two는 다시 Three의 기본 클래스입니다.

class One { 
}
class Two : One {
}
class Three : Two { 
}

공변성(Covariance)이란?

C#에서는 기본 클래스 참조 변수가 파생 클래스의 인스턴스를 담을 수 있지만, 그 반대는 불가능합니다. 공변성을 활용하면 기본 타입이 필요한 위치에 파생 타입을 전달할 수 있습니다.

즉, One 타입이 기대되는 곳에 TwoThree 객체를 자유롭게 할당할 수 있다는 의미입니다.

One obj = new Three(); // 공변성 덕분에 가능

공변성은 C#의 다음 요소들에서 사용할 수 있습니다.

  • 배열(Array)
  • 인터페이스(Interface)
  • 델리게이트(Delegate)
  • 제네릭 형식 매개변수(out 키워드)

반공변성(Contravariance)이란?

반공변성은 주로 메서드 매개변수와 관련이 있습니다. 기본 클래스 타입의 매개변수를 받는 메서드는, 파생 클래스 타입의 매개변수를 기대하는 델리게이트에 할당할 수 있습니다.

쉽게 말해, 더 일반적인(상위) 타입을 처리할 수 있는 메서드가 더 구체적인(하위) 타입을 요구하는 델리게이트를 대신할 수 있다는 것입니다.

delegate void MyDelegate(Two item);

void HandleOne(One item) { }

MyDelegate d = HandleOne; // 반공변성으로 인해 허용됨

정리

  • 공변성(Covariance): 파생 타입을 기본 타입이 기대되는 곳에 사용 — 결과 값의 방향
  • 반공변성(Contravariance): 기본 타입 매개변수 메서드를 파생 타입 델리게이트에 할당 — 입력 값의 방향

C# 4.0부터 제네릭 인터페이스와 델리게이트에서 out(공변성)과 in(반공변성) 키워드로 이를 명시적으로 지원하고 있으므로, LINQ나 이벤트 처리 코드를 작성할 때 이 개념을 활용하면 훨씬 유연한 설계가 가능합니다.