ITEM 22 :: EFFECTIVE C#
안녕하세요, 22번째 시간입니다. 이번에는 다소 생소한 기능이지만, 잘만 사용한다면 많이 편리할 기능입니다.
이번 챕터는 공변성과 반공변성을 지원하라, 입니다. 다소 어려운 단어선택이라, 어려운 내용이라 생각했지만 내용은 생각보다 간단한 내용입니다. 물론, 사용은 어려울 게 뻔해보였지만요.
설명
가변성 : 즉, 공변과, 반공변은, 특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격을 일컫는다. 이러한 변환을 지원하려면 제네릭 인터페이스나 델리게이트의 정의 부분에 제네릭 공변/반공변을 지원한다는 의미의 데코레이터를 추가해야한다! 가변성의 반대는 불변성이라고 한다. 이를 사용했을 때의 장점은 우리가 개발하는 API를 더 다양하고 안전하게 사용할 수 있다.
공변과 반공변이란, 타입 매개변수로 주어지는 타입들이 상호 호환 가능할경우 이를 이용하는 제네릭 타입도 호환 가능함을 추론하는 기능이다. X를 Y로 바꿔서 사용할 수 있는 경우 C
또한, 컬렉션에 대한 공변성은 컬렉션에 저장할 타입들이 상속 관계에 있을 때 고려 대상이 된다. 이것이 엄밀한 정의는 아니지만, 이렇게 기억하는 편이 편리하다. 엄밀한 정의가 아닌 이유는 대부분의 경우에서는 문제없이 진행되나, 어떤 경우는 문제가 발생하는 경우도 있기 때문이다.
사용 방법은 간단하다. 공변(out)성과 반공변성(in)을 지원하는 경우 C
공변,반공변성을 지정하는 것은 어려운 일이 아니나, 이를 알맞게 쓰는 것은 상당한 고민이 필요한 행동이며, 가변 인터페이스는 불변 인터페이스를 반환할 수 없다. 또한 하나의 타입에 공변성과 반공변성을 동시에 지정할 수는 없다.
결론
제네릭 클래스, 인터페이스를 작성할 땐 공변성 혹은 반공변성이 지원되면좋고, 지원될 경우에는 반드시 명시를 해주자. 그래야 컴파일러가 그에 대한 실수를 더욱 빨리 발견할 수 있고, 사용 과정에서 생기는 실수도 미리 알려준다. 그리고 공변성과 반공변성이 지원됨은, 여러 제네릭을 제약없이 사용함을 의미하니제네릭을 작성할 때는 최대한 공변성과 반공변성을 유지할 수 있도록 하자.