코틀린 변성(Variance)
09 Dec 2024코틀린의 변성에 대해서 알아보자.
변성
코틀린에서 변성은 제네릭 타입의 상속 관계가 어떻게 적용되는지를 다루는 개념이다.
변성은 타입 파라미터가 달라질 때 제네릭 타입의 하위 타입 관계가 어떻게 달라지는지를 설명하는 제네릭 타입의 한 측면이다.
변성은 공변성, 반공변성, 불변성 등으로 나눌 수 있다.
변성은 주로 타입 파라미터의 상속 관계를 관리하는 데 사용되며, 이를 통해 부모 타입과 자식 타입 간의 변환 가능성을 제어한다.
왜 제네릭 타입은 타입 인자 사이의 하위 타입 관계를 그대로 유지하고 어떤 타입은 그렇지 못할까?
이러한 구분은 어떤 제네릭 타입이 자신의 타입 파라미터를 취급하는 방법에 달려 있다.
- T 타입의 값을 반환하는 연산만 제공하고 T 타입의 값을 입력으로 받는 연산은 제공하지 않는 제네릭 타입인 생산자
- T 타입의 값을 입력으로 받기만 하고 결코 T 타입의 값을 반환하지는 않는 제네릭 타입의 소비자
- 위 두 가지 경우에 해당하지 않는 나머지 타입들
공변성
공변성은 제네릭 타입의 상속 관계가 같은 방향으로 적용되는 경우를 말한다.
부모 타입은 자식 타입을 대체할 수 있다는 것이다.
왜 불변 컬렉션 타입은 하위 타입 관계가 유지될까?
불변 컬렉션은 T 타입의 값을 만들어내기만 하고 절대 소비하지 않는다.
예를 들어, List
이런 경우 제네릭 타입이 타입 인자에 대해 공변적이라고 말한다.
코틀린에서 생산자 역할을 하는 타입은 모두 공변적이다.
주의! 불변성과 공변성은 같지 않다. 가변 타입을 공변적으로 만들 수도 있다.
코틀린에서 out 키워드를 사용해서 공변성을 나타낸다.
out은 해당 타입이 읽기 전용임을 의미한다.
반공변성
반공변성은 제네릭 타입의 타입 파라미터가 하위 타입에서 상위 타입으로 변환될 수 있음을 나타낸다.
T가 S의 상위 타입일 때, Consumer로 대체될 수 있다.
코틀린에서 in 키워드를 사용하여 반공변성을 나타낸다.
in은 해당 타입이 쓰기 전용임을 의미한다.
불변성
불변성은 제네릭 타입이 상속 관계에서 변하지 않는다는 의미다.
즉, 상위 타입을 하위 타입으로 변환할 수 없다는 뜻이다.
변성을 합리적으로 사용하면 타입 안전성을 해치지 않으면서 API 유연성을 향상시킬 수 있다.