제네릭(Generic)은 C#과 Java와 같은 객체지향 프로그래밍에서 사용하는 기법으로,
한 번의 정의로 여러 종류의 데이터 타입을 다룰 수 있도록 하는 방법이다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법으로,
데이터 타입(data type)을 일반화한다(generalize)는 것을 의미한다.
JavaScript에서는 Type을 지정하지 않지만, TypeScript 또한 JAVA와 마찬가지로 제네릭을 사용할 수 있다.
제네릭은 보통 타입을 일반화하여 처리하는 방법을 사용한다.
// number 타입의 매개변수를 return하는 함수
function NumberReturnFunc(arg: number): number {
return arg;
}
// strng 타입의 매개변수를 return하는 함수
function StringReturnFunc(arg: string): string {
return arg;
}
함수의 기능은 똑같은데, 매개변수의 타입과 반환 타입이 다를 경우 여러 개의 함수를 만들어야 한다.
하지만 제네릭 기법을 사용하면 한 개의 함수로 구현할 수 있다.
function GenericReturnFunc<T>(arg: T): T {
return arg;
}
클래스나 메소드 내부에서 사용되는 객체의 타입(type) 안정성을 높일 수 있다.
컴파일 타임에 타임 체크를 수행하기 때문에 런타임 에러를 줄일 수 있다.
또한, 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
코드의 재사용성이 높아진다.
컴파일 시에만 타입(type) 안정성을 제공하고, 런타임 시점에는 타입(type) 안정성을 제공하지 못 한다.
만약 컴파일 과정에서 타입 검사를 실시하지 않는 any와 같은 타입으로 형변환을 한다면
타입의 안정성을 보장할 수 없다.
따라서 제네릭 함수를 사용할 때는 타입 안정성을 보장하기 위해 any 타입 대신 명시적인 타입을 사용해야 한다.