-
변성(Variance) 개념 정리프로그래밍 language 2022. 8. 31. 21:11
변성
- 타입 파라미터의 관계에 따라, 제네릭 타입의 관계가 어떻게 되는지를 나타내는 개념
- 변성에는 대표적으로 공변(covariant), 무공변(invariant), 반공변(contravariant) 등이 있음
- 정적타입 언어에서는 제네릭을 사용함으로써 변성이란 개념이 있음 (ex. Java, Kotlin, TypeScript etc...)
- 제네릭을 잘 사용하려면 변성에 대한 이해가 필요
- 변성을 잘 사용하면 타입 안전성을 해치지 않으면서 범용적인 API를 만들 수 있음
공변(covariant)
- 타입 파라미터의 상하위 타입 관계와 제네릭 타입의 상하위 타입 관계가 같은 개념
- 타입 S가 타입 T의 하위 타입이면, Class<S>도 Class<T>의 하위 타입임
무공변(또는 불공변, invariant)
- 타입 파라미터의 상하위 타입 관계와 제네틱 타입의 상하위 타입 관계가 관련이 없는 개념
- 타입 S가 타입 T의 하위 타입이더라도, Class<S>와 Class<T> 사이에 상하위 타입 관계가 없음
- 제네릭은 기본적으로 무공변임 (배열은 공변임)
- 이러한 상황을 유연하게 처리하기 위해 와일드카드 타입을 추가했음
- 한정적(bounded) 와일드카드 타입
- 상한 경계(Upper bounded) 와일드카드를 사용해서 공변을 만듦
- 하한 경계(Lower bounded) 와일드카드를 통해 반공변을 만듦
- 한정적(bounded) 와일드카드 타입
- 이러한 상황을 유연하게 처리하기 위해 와일드카드 타입을 추가했음
반공변(contravariant)
- 타입 파라미터의 상하위 타입 관계와 제네릭 타입의 상하위 타입 관계가 반대인 개념
- 타입 S가 타입 T의 하위 타입일 때, Class<S>가 Class<T>의 상위 타입임
참고 자료
- https://sungjk.github.io/2021/02/20/variance.html
- https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
- https://mangkyu.tistory.com/241
- https://medium.com/mj-studio/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%A0%9C%EB%84%A4%EB%A6%AD-in-out-3b809869610e
- https://kotlinlang.org/docs/generics.html#generics-type-checks-and-casts
'프로그래밍 language' 카테고리의 다른 글
[Kotlin] scope function(범위 함수) - let, also, with, run, apply (0) 2022.09.01