본문 바로가기
Programming Language/Kotlin

변성

by YellowCow 2023. 10. 21.

배경

Integer는 Number를 상속받아 만들어진 객체이다.
그래서 Interger는 Number의 하위 타입이라고 할 수 있어 아래와 같은 코딩이 가능함

public void test() {
    List<Number> list;
    list.add(Integer.valueOf(1));
}

하지만 List<Integer>는 List<Number>의 하위타입이 될 수 없음
이러한 상황에서 Java나 Kotlin에서는 type parameter에 타입 경계를 명시하여 Sub-TypeSuper-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

- 리스코프 치환 법칙

https://velog.io/@harinnnnn/OOP-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-5%EB%8C%80-%EC%9B%90%EC%B9%99SOLID-%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84-%EC%B9%98%ED%99%98-%EC%9B%90%EC%B9%99-LSP

'Programming Language > Kotlin' 카테고리의 다른 글

Late Init  (1) 2023.10.31
Lazy Init - Synchronization 옵션  (0) 2023.10.30
Lazy Init - 기본  (0) 2023.10.28

댓글