본문 바로가기

TypeScript

TypeScript 제네릭(Generics)

타입스크립트에서 Generics(일반화)는 코드의 유연성을 높이고 재사용성을 높이는 데 도움이 되는 강력한 기능입니다.

Generics를 사용하면 함수, 클래스, 인터페이스 등에서 사용되는 데이터 타입을 명확하게 지정하지 않고 , 나중에 사용될 때에 결정할 수 있습니다.

 

Generics를 사용하면 재사용 가능한 코드를 작성할 때 특정 타입에 의존하지 않고 유연하게 사용 할 수 있습니다.

예를 들면, 배열을 역순으로 정렬하는 함수를 작성하고자 할때, 이 함수가 어떤 타입의 배열에 대해서도 작동하도록 Generics를 활용 할 수 있습니다.

 

function reverseArray<T>(arrayL T[]): T[] {
	return array.reverse();
}

let numbers: number[] = [1, 2, 3, 4, 5];
let reversedNumbers: number[] = reverseArray(numbers);
console.log(reversedNumbers); // [5, 4, 3, 2, 1]

let strings: string[] = ["apple", "banana", "orange"];
let reversedStrings: string[] = reverseArray(strings);
console.log(reversedStrings); // ["orange", "banana", "apple"]

위의 예제에서 reverseArray 함수는 제네릭 타입 매개변수 T 를 사용하여 배열의 요소 타입을 지정하지 않고 , 어떤 타입의 배열이든 역순으로 정렬할 수 있도록 합니다. 함수 호출시에 타입이 결정되며, TypeScript 컴파일러는 타입 추론을 통해 적절한 타입을 유추합니다.

 

 

간단한 스택(Stack) 자료구조를 구현해보자. 해당 스택에는 특정 타입의 요소만 넣을 수 있도록 제네릭을 활용한 예제입니다.

class Stack<T> {
  private items: T[];

  constructor() {
    this.items = [];
  }

  push(item: T): void {
    this.items.push(item);
  }
  pop(): T | undefined {
    return this.items.pop();
  }
  peek(): T | undefined {
    return this.items[this.items.length - 1];
  }
  isEmpty(): boolean {
    return this.items.length === 0;
  }
  size(): number {
    return this.items.length;
  }
  clear(): void {
    this.items = [];
  }
}

let numberStack = new Stack<number>();
numberStack.push(1);
numberStack.push(2);
numberStack.push(3);

console.log(numberStack.peek()); // 3
console.log(numberStack.size()); // 3

// 문자열 타입을 저장하는 스택 생성
let stringStack = new Stack<string>();
stringStack.push("apple");
stringStack.push("banana");
stringStack.push("orange");

console.log(stringStack.peek()); // orange
console.log(stringStack.size()); // 3

위의 예제에서 Stack 클래스는 제네릭 타입 매개변수 T를 사용하여 요소의 타입을 유연하게 지정할 수 있습니다. 이렇게 하면 Stack 클래스를 생성할 때 특정 타입을 명시할 수 있으며, 해당 스택은 지정된 타입의 요소만을 저장할 수 있습니다.

 

 

'TypeScript' 카테고리의 다른 글

TypeScript 인터페이스  (0) 2024.02.20
Typescript 기초  (1) 2024.02.07