[typescript] 제네릭과 가변성 문제

제네릭과 가변성은 타입스크립트에서 매우 중요한 주제입니다. 제네릭을 사용하면 코드의 재사용성을 높일 수 있고, 타입 안정성을 유지할 수 있습니다. 하지만 가변성은 제네릭을 사용할 때 발생할 수 있는 문제를 다루는데 필요합니다.

제네릭이란 무엇인가?

제네릭은 타입스크립트에서 함수, 클래스, 인터페이스를 작성할 때 타입 매개변수를 사용하여 여러 종류의 타입에서 동작할 수 있는 코드를 작성하는 기능을 말합니다. 이를 통해 재사용성이 높아지고 동적으로 타입을 지정할 수 있습니다.

예를 들어, 배열의 요소를 역순으로 반환하는 기능을 제네릭을 사용하여 작성한다면 다음과 같이 할 수 있습니다.

function reverse<T>(input: T[]): T[] {
  return input.reverse();
}

위 예제에서 T는 타입 매개변수로, 함수가 전달받는 배열의 타입을 유연하게 처리할 수 있도록 합니다.

가변성이란 무엇인가?

가변성은 하위 타입 관계(subtyping) 가 발생하는 상황에 관여하는 개념으로, 공변성, 반공변성, 무가변성 이 세가지 종류가 있습니다.

공변성

공변성은 서브 타입 관계가 유지되는 성질을 말합니다. 즉, A가 B의 서브 타입인 경우, Some<A>Some<B>의 서브 타입이 되는 것을 의미합니다.

반공변성

반공변성은 공변성과 정반대의 개념으로, 슈퍼 타입 관계가 유지되는 성질을 말합니다. 즉, A가 B의 슈퍼 타입인 경우, Some<B>Some<A>의 서브 타입이 되는 것을 의미합니다.

무가변성

무가변성은 서브 타입 관계가 유지되지 않는 성질을 말합니다. 자바스크립트의 배열과 같이 타입이 유동적인 경우 무가변성이 적용됩니다.

제네릭과 가변성의 문제

제네릭을 사용할 때, 가변성이 일반적으로 발생하는데, 타입 매개변수에 대한 가변성 설정을 잘못하면 타입 안정성이 충족되지 않을 수 있습니다. 이로 인해 예기치 않은 동작이 발생할 수 있기 때문에, 가변성과 관련된 문제를 이해하고 해결하는 것이 중요합니다.

결론

제네릭을 사용하면 코드의 재사용성과 타입 안정성을 유지할 수 있지만, 가변성에 대한 이해와 적절한 설정이 필요합니다. 올바른 가변성 설정을 통해 안정적이고 유연한 코드를 작성할 수 있습니다.