[typescript] 제네릭 함수와 클래스

제네릭(Generic)은 TypeScript에서 타입 안정성을 유지하면서 다양한 타입의 데이터를 다룰 수 있게 해주는 강력한 기능입니다. 제네릭을 사용하면 타입을 파라미터화하여 재사용 가능한 컴포넌트를 만들 수 있고, 프로그램의 유연성을 확보할 수 있습니다.

제네릭 함수

제네릭 함수는 함수의 매개변수나 반환 값의 타입을 파라미터화하여 여러 타입의 객체에 대해 동작할 수 있도록 합니다. 예를 들어, 배열을 입력받아 배열의 요소 중 가장 작은 값을 반환하는 함수를 작성할 때 제네릭을 사용할 수 있습니다.

아래는 제네릭 함수의 간단한 예시입니다.

function getSmallest<T>(arr: T[]): T {
  let smallest = arr[0];
  for (let item of arr) {
    if (item < smallest) {
      smallest = item;
    }
  }
  return smallest;
}

let numbers = [3, 1, 7, 4, 2];
let minNumber = getSmallest(numbers); // minNumber will be 1

위 예제에서 getSmallest 함수는 <T>를 사용하여 제네릭으로 정의되었습니다. arr 매개변수는 배열이므로 T[] 형태로 작성되었고, 반환 값도 T로 선언되었습니다.

제네릭 클래스

제네릭 클래스는 클래스의 속성이나 메서드의 타입을 파라미터화할 수 있게 해줍니다. 예를 들어, 스택(Stack) 자료구조를 구현하는 클래스를 작성할 때 제네릭을 사용하면 다양한 타입의 데이터를 저장할 수 있습니다.

아래는 제네릭 클래스의 예시입니다.

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

  push(item: T): void {
    this.items.push(item);
  }

  pop(): T | undefined {
    return this.items.pop();
  }
}

let numberStack = new Stack<number>();
numberStack.push(1);
numberStack.push(2);
console.log(numberStack.pop()); // 2

let stringStack = new Stack<string>();
stringStack.push('hello');
stringStack.push('world');
console.log(stringStack.pop()); // 'world'

위 예제에서 Stack 클래스는 <T>를 사용하여 제네릭으로 정의되었습니다. 클래스 내부의 items 배열과 push, pop 메서드는 모두 제네릭 타입 T를 사용하여 선언되었습니다.

제네릭을 사용하면 코드의 재사용성과 유연성을 높일 수 있으며, 타입 안정성을 유지하면서 다양한 타입의 데이터를 다룰 수 있게 됩니다.

결론

제네릭 함수와 클래스는 TypeScript에서 코드의 재사용성과 타입 안정성을 높이는데 큰 도움이 됩니다. 제네릭을 잘 이해하고 활용하면 유연하고 안정적인 프로그램을 작성할 수 있으며, 다양한 데이터 타입을 다루는데 있어 효과적인 도구가 될 것입니다.

참고 자료