제너릭 (Generic)

Changhan·2025년 2월 12일

Typescript

목록 보기
27/29

객체 지향 프로그래밍에서 중요한 개념 중 하나인 제너릭에 대해서 알아보자.

함수에서의 제너릭

function genericWhatValue<T>(value: T): T {
  return value;
}
const genericResult1 = genericWhatValue<string>('123'); 

제너릭은 기본적으로 위와 같은 형태로 사용한다.

genericWhatValue 함수를 호출할 때 제너릭 타입으로 string을 넣어줬기 때문에 선언문에서의 T는 string이 되고, 매개변수도 T, 반환 타입도 T가 된다. 그리고 인자도 마찬가지로 string 타입만 넣을 수 있게 된다.

제너릭은 타입을 변수화해서 사용하는 것과 비슷한 느낌이 든다.

제너릭으로 자동으로 타입 추론

const genericResult2 = genericWhatValue('123'); // type: '123'
let genericResult3 = genericWhatValue('123'); // type: string

'123'이라는 string literal로 타입이 입력이 되었기 때문에 genericWatchValue의 제너릭 타입은 '123'이 된다.

여러 개의 제너릭 사용하기

function Singer<N, A>(name: N, age: A) {
  return {
    name,
    age,
  };
}
const singer = Singer<string, number>('태연', 32);
console.log(singer);

여러 개의 제너릭을 선언해주는 것도 가능하다.


인터페이스에서의 제너릭

interface Cache<T> {
  data: T[];
  lastUpdate: Date;
}
const cache1: Cache<string> = {
  data: ['data1', 'data2'],
  lastUpdate: new Date(),
};

Cache 인터페이스의 제너릭 타입에 string을 넣어줌으로써 data 프로퍼티는 string[] 타입을 가진다.

const cache2: Cache = {
  data: [123, 3456],
  lastUpdate: new Date(),
}; // error

인터페이스로 선언한 타입 또한 자동으로 타입 추론이 되지 않는다.

기본 타입 설정

interface DefaultGeneric<T = string> {
  data: T[];
}
const cache3: DefaultGeneric = {
  data: ['123', '435'],
};

제너릭 타입을 선언하지 않으면 타입 추론이 되지 않아 에러가 발생하지만, 인터페이스 선언문에서 타입의 기본값을 설정하면 에러가 발생하지 않는다.

interface Singer<T = string, N = number> {
  name: T;
  age: N;
}
const taeyeon: Singer = {
  name: '태연',
  age: 32,
};

타입에서의 제너릭

type Singer<T> = T;
const yuna: Singer<string> = '윤아';

const yuna: Singer = '윤아'; // error

타입에서도 자동으로 타입 추론이 되지 않는다.

기본 타입 설정

type Sattus<T = string> = DoneState<T>;

let status: Sattus = {
  data: ['123213'],
};

타입에서도 제너릭 타입을 주지 않고, 기본 타입을 설정해줄 수 있다.

후기

제너릭들 배우기 이전에는 스쳐 지나가면서 봤었던 코드들을 봤을 때 마치 아예 생판 모르는 다른 나라의 언어를 보는 듯한 느낌을 받았었다. 하지만 배워가면서 그 언어들이 어떤 의미를 가지고 있는지 깨달음 얻어서 좋은 시간이었다.

0개의 댓글