코틀린의 제네릭과 가변성에 대해

최지환·2022년 3월 23일
0

코틀린

목록 보기
3/4
post-thumbnail

공변성, 반공변성, 무변성

이전 포스팅에서 제네릭에 대해 글을 쓰던중 공변성이라는 개념이 나왔다. 이에 대해 알아보기 전에 가변성이라는 개념을 알아야한다.
우선 코틀린에서의 가변성이 무엇인지 먼저 짚어보자.

가변성

가변성은 형식 매개변수가 클래스 계층에 영향을 주는 것을 말한다고 한다. 예를 들어 형식 A의 값을 필요로하는 모든 클래스에 형식 B의 값을 넣어도 아무 문제가 없다면 B는 A의 하위 형식이다.

예를 들어 Int 클래스는 Number클래스에서 상속 받았고, Number 클래스 변수에 Int의 인스턴스를 넣어줄 수 있다. 그렇다면 Int는 Number의 하위 형식이다.

val integer: Int = 1
val number: Number = integer 
// integer 가 Number 타입 변수 number에 할당 됨. -> Int는 Number의 하위 자료형

가변성의 3가지 유형

가변성에는 공변성(Covariance), 반공변성(Contravariance), 무변성(Invariance) 이렇게 세가지 유형이있다. 이를 알아보자.

공변성 (Covariance)

T’가 T의 하위자료형이면, Class<T’>는 Class의 하위 자료형이다 → 생산자 입장의 out 성질

Class Type<Out T>로 위의 관계를 표현하자면, Class Type는 Class Type의 하위 자료형이 된다.

이를 생산자 입장의 out 성질이라고 한다고 한다.

반공변성 (Contravariance)

T’가 T의 하위 자료형이면, Class는 Class<T’>의 하위자료형이다

이는 공변성과 정반대되는 개념이다. int형이 Number형의 하위 자료형인 것은 우리가 이미 알고 있다. 이때 Class Type< In T > 로 표현하면, Class Type< Number> 가 Class Type의 하위 자료형이된다.

이를 소비자 입장의 In 성질이라 한다.

무변성 (Invariance)

C 와 C<T’>는 아무 관계가 없다

말 그대로 Class< T>와 Class는 아무런 관계가 없다는 것 이다.

이 세가지 성질을 그림으로 나타내보자

각각의 특징을 한눈에 파악해보자. 여기서 화살표는 자료형 관계를 나타낸다.


각각의 세가지 성질에 대해 알아보았다.

일반적으로 우리가 제네릭을 사용할 때 주의해야할 점은 이런 클래스간 상하관계를 파악을 하더라도, Out In 키워드를 적절하게 사용하지 않아. 타입 미스매치 에러를 불러일으킨다.

특히 제네릭을 사용할 때, Out, Int 키워드가 없으면 무변성으로 선언된다. (이전 포스팅에 다룬 타입 불변성)
따라서 개발자가 사용하려는 형식의 상하관계를 알고 있어도, Out, In 키워드를 적절하게 사용하지 않으면 코틀린은 타입 안정성을 위해 에러를 발생시킨다.

그러니 이를 적절하게 사용해야한다.

0개의 댓글