// number 타입의 리스트를 생성하는 클래스
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();
const stringList = new List(["1", "2"]);
stringList.push("hello");
이렇게 클래스의 이름 뒤에 타입 변수를 선언하면 제네릭 클래스가 되고, 이 타입 변수는 이제 클래스 내부에서 자유롭게 사용할 수 있다.
또, 클래스는 생성자를 통해 타입 변수의 타입을 추론할 수 있기 때문에 생성자에 인수로 전달하는 값이 있을 경우 타입 변수에 할당할 타입을 생략해도 된다.
만약 타입변수의 타입을 직접 설정하고 싶다면 다음과 같이 작성하면 된다.
class List<T> {
constructor(private list: T[]) {}
(...)
}
const numberList = new List<number>([1, 2, 3]);
const stringList = new List<string>(["1", "2"]);