숫자 배열을 관리하는 NumberList 클래스를 만들어보자.
class NumberList {
constructor(private list: number[]) {}
push(data: number) {
this.list.push(data);
}
pop() {
return this.list.pop();
}
print() {
console.log(this.list);
}
}
list 필드는 private으로 설정하여 클래스 내부에서만 접근 가능하도록 했다.
생성자에서 필드 선언과 초기화를 동시에 수행하며, push, pop, print 메서드로 배열을 조작한다.


만약 문자열 배열을 관리하는 StringList 클래스도 필요하다면 어떻게 해야 할까?
제네릭 없이는 새로운 클래스를 만들어야 하므로 중복 코드가 발생한다.
제네릭 클래스 사용하기
제네릭을 사용하면 하나의 클래스로 여러 타입을 처리할 수 있다.

class List<T> {
constructor(private list: T[]) {}
push(data: T) {
this.list.push(data);
}
pop() {
return this.list.pop();
}
print() {
console.log(this.list);
}
}
const numberList = new List([1, 2, 3]);
numberList.pop();
numberList.push(4);
numberList.print(); // [1, 2, 4]
const stringList = new List(["1", "2"]);
stringList.push("hello");
stringList.print(); // ["1", "2", "hello"]
클래스 이름 뒤에 <T>를 선언하면 제네릭 클래스가 되고, 타입 변수 T를 클래스 내부에서 자유롭게 사용할 수 있다.
생성자에 전달하는 배열의 타입에 따라 T가 자동으로 추론된다.
타입 명시하기
타입 변수를 직접 지정하고 싶다면 다음과 같이 작성한다.
const numberList = new List<number>([1, 2, 3]);
const stringList = new List<string>(["1", "2"]);
생성자에 인수를 전달하면 타입이 자동으로 추론되므로 대부분의 경우 타입을 생략해도 된다.
'TIL' 카테고리의 다른 글
| [TS] 제네릭 함수 타입 정의 및 응용 연습 (0) | 2025.11.04 |
|---|---|
| [TS] 프로미스와 제네릭 (0) | 2025.11.04 |
| [TS] 제네릭 인터페이스와 타입 별칭 (0) | 2025.11.04 |
| [TS] map, forEach 메서드 타입 정의하기 (0) | 2025.11.04 |
| [TS] 제네릭 타입 변수 응용 (0) | 2025.11.04 |
