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