제네릭(Generics)

제네릭(Generics)

1. 제네릭(Generics)

  • 이번엔 제네릭(Generics)에 대해 알아봅시다!
  • 제네릭이란? 코드를 재사용하고 유연성을 높이는 데 사용되는 강력한 도구입니다.
  • 제네릭을 사용하면 함수, 클래스, 인터페이스 등을 정의할 때 데이터 타입을 명시하지 않고 추상적으로 유지할 수 있습니다.
  • 이렇게 하면, 여러 종류의 유형을 다루는 함수 or 클래스만들 수 있습니다.

 

2. 사용방법

  • 사용방법에 대해 알아봅시다.
  • 다음 코드를 확인해 봅시다.

    → getSize라는 함수를 arr1은 사용할 수 있지만, arr2string타입이라 사용할 수 없습니다.

function getSize(arr: number[]): number {
    return arr.length;
}

const arr1 = [1, 2, 3];
getSize(arr1); // 3

const arr2 = ["a", "b", "c"];
getSize(arr2); // 에러발생

 

  • arr2도 사용하려면, 다음과 같이 입력해줍니다.
function getSize(arr: number[] | string[]): number {
    return arr.length;
}

const arr1 = [1, 2, 3];
getSize(arr1); // 3

const arr2 = ["a", "b", "c"];
getSize(arr2); // 3

 

  • 여러 타입이 늘어날 수록 코드가 길어지기 때문에 제네릭을 사용해 줍니다.
  • 제네릭<T>임의의 문자를 사용하여, 타입 매개변수를 선언해 줍니다.
  • 제네릭을 사용하면, 코드는 다음과 같아집니다.

    → 여기서 T타입 매개변수로 사용되었습니다. 함수 or 클래스의 내부에서일반적인 타입처럼 사용됩니다. 

function getSize<T>(arr: T[]): number {
    return arr.length;
}

const arr1 = [1, 2, 3];
getSize<number>(arr1); // 3

const arr2 = ["a", "b", "c"];
getSize<string>(arr2); // 3

const arr3 = [false, true, false];
getSize<boolean>(arr3); // 3

const arr4 = [{}, {}, { name: "Kim" }];
getSize(arr4); // 3

 

  • 인터페이스를 활용하여 다음과 같이 코드를 만들 수 있습니다.
interface Mobile<T> {
    name: string;
    price: number;
    option: T;
}

const m1: Mobile<object> = {
    name: "s23",
    price: 1000,
    option: {
        color: "red",
        coupon: false,
    },
};

const m2: Mobile<string> = {
    name: "s22",
    price: 900,
    option: "good"
};

const m3: Mobile<{color: string; coupon: boolean}> = {
    name: "s23",
    price: 1000,
    option: {
        color: "blue",
        coupon: true,
    },
};

 

3. 정리하며

  • 지금까지 제네릭(Generics)에 대해 알아보았습니다.
  • 다음 시간엔 유틸리티 타입 정의와 유형에 대해 알아보겠습니다.
 

유틸리티 타입

유틸리티 타입 1. 유틸리티 타입 이번엔 유틸리티 타입에 대해 알아봅시다. 유틸리티 타입은 기존 타입을 변환하거나 새로운 타입을 생성하기 위해 사용되는 내장 타입입니다. 유틸리티 타입은

newbean-j.tistory.com

 

※ 코딩앙마님의 유튜브 강좌를 참고하였습니다.

'Front-End Study > TypeScript' 카테고리의 다른 글

TypeScript가 적용된 React 프로젝트 생성  (0) 2024.05.12
유틸리티 타입  (0) 2024.02.21
클래스(Class)  (0) 2024.02.19
함수 (function)  (0) 2024.01.31
인터페이스 (interface)  (0) 2024.01.29