타입스크립트 8일차 - 제네릭

제네릭

다른 자바, C# 같은 언어에서 사용되었던 제네릭이 타입스크립트에 들어왔습니다.

제네릭은 함수나 클래스를 선언할 때 타입을 고정시키지 않고 사용시 명시해 타입을 유연하게 사용하도록 도와주는 방법입니다.

제네릭에 대해 알아보겠습니다.

any타입을 쓰면 안될까?

1
2
3
function anyFunc(strs: any, strs2: any): any{
return strs + strs2;
}

위와 같은 함수가 있다고 가정해봅시다.

any의 앖이 숫자만 들어온다면 두 숫자의 합이 출력될 것이고, 문자열이 들어온다면 문자열이 합쳐진 결과가 나올 것입니다.

만약 나는 숫자를 썼는데 '1'의 문자열이 들어간다면 왜 안되지? 하면서 시간을 쓸 수 있습니다.

즉, 타입스크립트의 타입안전성을 보호하지 못하는 것이죠.

사용해보기

예제 코드를 만들어 보겠습니다.

1
2
3
4
5
6
7
8
function genericFunc<T>(arr1: T[], arr2: T[]){
return arr1.concat(arr2);
}

let array1 = [1,2];
let array2 = [3,4];
let resultArray = genericFunc<number>(array1, array2);
console.log(resultArray.join(","));

위와 같은 코드를 찍어보면 1,2,3,4가 출력될 것입니다.

함수를 호출 시 <타입>을 넣어준다면 안의 함수에 따로 타입을 선언하지 않아도 자동으로 할당되어 실행되게 됩니다.

즉, arr1과 arr2에게 타입이 같이 선언되어 한쪽은 문자열, 한쪽은 숫자 이런식으로 안전성이 깨질일이 없이 안전성을 갖추게 됩니다.

마지막으로 T는 Object 혹은 Any와 같이 어떠한 타입이 들어와도 상관없다는 약속된 표시입니다.

상속을 활용한 제네릭

제네릭에서 특정 타입을 상속한 클래스나 타입을 받을 수 있습니다.

<T extends 타입> 이런식으로 특정 타입을 상속한 제네릭을 사용 가능합니다. 반드시 any, object같은 all free 타입이 아니라 특정 타입만 받을 수도 있습니다.

<T extends 타입1 | 타입2> 이런식으로도 유니언 타입도 이용 가능합니다.

마무리

이런식으로 제네릭을 사용하면 타입안전성을 보충할 수 있습니다.

OOP 언어와 같은 이유로 제네릭을 만들었으므로 같은 목적으로 사용하면 될 것 같습니다.