배경
Integer는 Number를 상속받아 만들어진 객체이다.
그래서 Interger는 Number의 하위 타입이라고 할 수 있어 아래와 같은 코딩이 가능함
public void test() {
List<Number> list;
list.add(Integer.valueOf(1));
}
하지만 List<Integer>는 List<Number>의 하위타입이 될 수 없음
이러한 상황에서 Java나 Kotlin에서는 type parameter에 타입 경계를 명시하여 Sub-Type, Super-Type을 가능하게 해 줌
위와 같이 제네릭을 타입으로 받는 클래스 간의 Sub-Type, Super-Type의 정의를 가능하게 해주는 것이 '변성'이다
주요개념
공변성
T’가 T의 서브타입이면, C<T’>는 C<T>의 서브타입이다.
공변성은 타입생성자에게 리스코프 치환 법칙을 허용하여 유연한 설계를 가능하게 함
* 리스코프 치환 법칙: 부모 객체와 자식 객체가 있을 때 부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체할 수 있다는 원칙
반공변성
T’가 T의 서브타입이면, C<T>는 C<T’>의 서브타입이다.
공변성의 반대 개념으로 자기 자신과 부모 객체만을 허용
무공변성
C와 C<T’>는 아무 관계가 없다.
Java, Kotlin의 Generic은 기본적으로 무공변성으로 아무런 설정이 없는 기본 Generic을 말함
* 참고문헌
- 변성
https://velog.io/@lsb156/covariance-contravariance
- 리스코프 치환 법칙
'Programming Language > Kotlin' 카테고리의 다른 글
Late Init (1) | 2023.10.31 |
---|---|
Lazy Init - Synchronization 옵션 (0) | 2023.10.30 |
Lazy Init - 기본 (0) | 2023.10.28 |
댓글