- Covariance and contravariance (computer science)
- Many programming language type systems support subtyping. For instance, if the type Cat is a subtype of Animal, then an expression of type Cat should be substitutable wherever an expression of type Animal is used.
해당 내용은 컴파일러 개발자거나,
컴파일러의 API를 사용하게 되거나,
아니면 컴파일러의 타입 시스템을 과도하게 사용하다보면
자연스레 만나게되는 내용입니다.
그리고 우리의 코딩 생활 속에서 자연스럽게 녹아들어있죠
간단하게 보면 두 타입 Animal과 Dog가 있을 때
Animal에 Dog가 할당이 된다면 공변성이고
반대로 Dog에 Animal이 할당이 된다면 반공변성입니다.
일반적으로는 Dog에 Animal을 할당을 못합니다.
왜냐하면 그건 일반적인 사람들의 시선에서는 합당치못하고
그러기에 컴파일러 개발자들은 이를 의식하여 일부 부분에만 반공변성을 집어넣게 되죠
보통은 위처럼 함수의 입력값에 대해서 반공변성을 작업하며, 출력값에 대해서는 공변성을 유지합니다.
이러한 반공변성이 왜 필요하냐라고 생각하실 수 있습니다.
이는 이벤트 핸들링과 같은 곳에서 좀 더 유연하고 다형성을 지키며 작업을 할 수 있게 도움을 줍니다.
오히려 공변성이면 문제가 생길 일들이 있기도 하죠
위 코드에서는 Dog가 들어갈 자리에 Animal을 넣어 유연성을 확보하고, 다형성을 신경 쓸 수 있게 해줬습니다.
오히려 Animal 대신 Chiwawa 같은 Dog의 하위타입이 들어갔다면, 이벤트 핸들러를 실행 시킬 때 Dog에는 없는 Chiwawa만의 인터페이스로 에러가 발생하겠지요
오히려 해당 함수를 실행할 때 Animal로 타입을 쓸거니 실행할 때 Animal의 하위타입 알아서 넣어줘 해서
Animal에 Dog가 할당한 것처럼 느껴질 수도 있습니다.
이처럼 보통 반공변성은 입력값에 주로 사용됩니다.
이변성, 불변성
짧게 짚고 넘어가자면 이변성은 공변성과 반공변성이 모두 되고, 불변성은 둘 모두 안됩니다.
마무리하면서
해당 내용이 간단하면 간단하고 복잡하다면 복잡한 내용이라
이런거 한번 직접 읽어보셔도 괜찮을 것 같습니다.
댓글0