[typescript] 가변성(Variancy) 문제의 개념
가변성(Variancy)은 타입 시스템의 중요한 개념 중 하나입니다. 특히, 제네릭과 관련하여 자주 다뤄지는 주제 중 하나입니다.
가변성이란 무엇인가?
가변성이란 타입 안정성(Type Soundness)을 유지하기 위한 개념으로, 서로 다른 타입 사이에서 어떤 관계를 허용하는지를 나타냅니다.
대부분의 경우, 다양한 타입 사이에 서로 다른 관계가 있을 수 있는데, 이를 가변성 규칙을 통해 제한합니다.
가변성의 세 가지 유형
- 공변성(Covariance)
- 반공변성(Contravariance)
- 무변성(Invariance)
각 유형은 다음과 같은 관계를 가집니다.
- 공변성:
T
가U
의 하위 타입일 때,Array<T>
가Array<U>
의 하위 타입입니다. - 반공변성:
T
가U
의 하위 타입일 때,(T) => void
가(U) => void
의 상위 타입입니다. - 무변성:
T
가U
의 하위 타입이어도, 관계가 유지되지 않습니다.
예제를 통한 이해
다음 TypeScript 코드를 통해 가변성의 세 가지 유형을 살펴보겠습니다.
// 공변성 예제
class Animal {}
class Dog extends Animal {}
let arrayOfAnimal: Array<Animal>;
let arrayOfDog: Array<Dog>;
arrayOfAnimal = arrayOfDog; // OK
// 반공변성 예제
function func1(arg: (animal: Animal) => void): void {}
function func2(arg: (dog: Dog) => void): void {}
func2 = func1; // OK
// 무변성 예제
class Box<T> {
value: T;
}
let box1: Box<Animal>;
let box2: Box<Dog>;
box1 = box2; // Error
정리
가변성 문제는 다양한 제네릭 타입 사이의 관계를 잘 이해하고, 타입 시스템의 안전성을 유지하기 위해 중요한 개념입니다. 올바른 가변성 규칙을 적용하여 타입 안정성을 유지하고, 안전한 코드를 작성하는 데 도움이 됩니다.
더 많은 정보는 타입스크립트 가이드를 참고할 수 있습니다.