쉽게 알려주는 제네릭 변성

Oak_Cassia·2025년 8월 28일
0

개요

주석에 나름 쉽게 적어보았다.

제네릭 변성은 인터페이스·델리게이트에서 LSP의 대체 가능성을 컴파일 타임에 타입 안전을 보장해, 필요할 때 캐스팅 없이 더 일반/구체적인 타입을 그대로 재사용할 수 있게 한다.
덕분에 LSP의 핵심인 “상위 타입에 하위 타입을 넣어도 정상 동작한다”는 점을 실제 코드에서 자연스럽게 활용할 수 있고, 궁극적으로는 “부품을 바꿔 끼워도 안전하게 동작하는 모듈식 설계”를 이루는 객체지향의 장점을 활용할 수 있다.


제네릭 변성(Generic Variance)

  • 제네릭 타입 매개변수가 상속 관계를 반영해 공변/반공변 변환을 허용하는 기능
    이는 인터페이스와 델리게이트에만 적용되며, 클래스와 구조체는 항상 무공변(invariant)이다.

공변성(covariance, out)

  • 반환 타입으로 사용할 때, IEnumerable<Derived>IEnumerable<Base> 변환 허용
  • 타입 매개변수가 출력/생산 위치에서 사용될 때 적용
  • 출력/생산 관점에서는 더 구체적인 타입을 더 일반적인 타입으로 취급 가능
    • 예: string → object, int → long
  • 공변 변환은 A(원래 타입) → B(변환 타입) 변환이 항등 변환이거나 암시적 참조 변환일 때만 허용

“나는 string/int를 만들어요. 그렇다면 object/long을 만든다고 해도 되겠죠. 내가 만든 걸 가져다 쓰세요.”

반공변성(contravariance, in)

  • 매개변수 타입으로 사용할 때, Action<Base>Action<Derived> 변환 허용
  • 타입 매개변수가 입력/소비 위치에서 사용될 때 적용
  • 입력/소비 관점에서는 더 일반적인 타입을 더 구체적인 타입으로 취급 가능
    • 예: object → string, long → int
  • 반공변 변환은 B(원래 타입) → A(변환 타입) 변환이 항등 변환이거나 암시적 참조 변환일 때만 허용

“나는 object/long을 소비할 수 있어요. 그렇다면 string/int를 소비한다고 해도 되죠. string/int를 줘보세요.”

무공변성(invariant)

  • 기본 제네릭은 상속 변환을 허용 안함
  • 타입 매개변수가 입력과 출력 모두로 사용될 때 적용
profile
https://velog.io/@oak_cassia/A-Game-Developers-Vision

0개의 댓글