주석에 나름 쉽게 적어보았다.
제네릭 변성은 인터페이스·델리게이트에서 LSP의 대체 가능성을 컴파일 타임에 타입 안전을 보장해, 필요할 때 캐스팅 없이 더 일반/구체적인 타입을 그대로 재사용할 수 있게 한다.
덕분에 LSP의 핵심인 “상위 타입에 하위 타입을 넣어도 정상 동작한다”는 점을 실제 코드에서 자연스럽게 활용할 수 있고, 궁극적으로는 “부품을 바꿔 끼워도 안전하게 동작하는 모듈식 설계”를 이루는 객체지향의 장점을 활용할 수 있다.
out
)IEnumerable<Derived>
→ IEnumerable<Base>
변환 허용string → object
, int → long
“나는 string/int를 만들어요. 그렇다면 object/long을 만든다고 해도 되겠죠. 내가 만든 걸 가져다 쓰세요.”
in
)Action<Base>
→ Action<Derived>
변환 허용object → string
, long → int
“나는 object/long을 소비할 수 있어요. 그렇다면 string/int를 소비한다고 해도 되죠. string/int를 줘보세요.”