제네릭 클래스
- 다음과 같이
number
타입을 가지고 push
, pop
, print
의 기능을 가진 클래스가 있다.
class NumberList {
constructor(private list: number[]) {}
push(data: number) {
this.list.push(data);
}
pop() {
this.list.pop();
}
print() {
console.log(this.list);
}
}
const numberList = new NumberList([1, 2, 3]);
numberList.pop();
numberList.push(4);
numberList.print();
- string 타입에 대한 기능을 만들고 싶다면 똑같은 코드에서 타입만 바뀌는 중복이 발생한다.
class StringList {
constructor(private list: string[]) {}
push(data: string) {
this.list.push(data);
}
pop() {
this.list.pop();
}
print() {
console.log(this.list);
}
}
const stringList = new StringList(["hi", "hello"]);
stringList.pop();
stringList.push("whoareyou");
stringList.print();
- 이런 비효율적인 코드를 막기 위해 제네릭 클래스를 만든다.
class List<T> {
constructor(private list: T[]) {}
push(data: T) {
this.list.push(data);
}
pop() {
this.list.pop();
}
print() {
console.log(this.list);
}
}
const stringList = new List(["hi", "hello"]);
stringList.pop();
stringList.push("whoareyou");
stringList.print();
const numberList = new List([1, 2, 3]);
numberList.pop();
numberList.push(4);
numberList.print();
※ 참고 ※
제네릭 클래스
는 제네릭 인터페이스
나 제네릭 타입변수
와는 다르게 클래스에 생성자를 호출할 때( ex) new List([1, 2, 3])
의 [1, 2, 3]
), 생성자에 인수로 전달하는 값을 기준으로 타입변수의 타입을 추론한다.
따라서 아래와 같이 타입을 명시해 주지 않아도 된다.
const numberList = new List<number>([1, 2, 3]);