[한입] 제네릭 클래스

TK·2023년 12월 17일
0

[강의] 한입 시리즈

목록 보기
44/59

제네릭 클래스

  • 다음과 같이 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();
// [ 1, 2, 4 ]

  • 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();
// [ 'hi', 'whoareyou' ]

  • 이런 비효율적인 코드를 막기 위해 제네릭 클래스를 만든다.
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();
// [ 'hi', 'whoareyou' ]

const numberList = new List([1, 2, 3]);
numberList.pop();
numberList.push(4);
numberList.print();
// [ 1, 2, 4 ]

※ 참고 ※

제네릭 클래스제네릭 인터페이스제네릭 타입변수와는 다르게 클래스에 생성자를 호출할 때( ex) new List([1, 2, 3])[1, 2, 3] ), 생성자에 인수로 전달하는 값을 기준으로 타입변수의 타입을 추론한다.


따라서 아래와 같이 타입을 명시해 주지 않아도 된다.

const numberList = new List<number>([1, 2, 3]);
profile
쉬운게 좋은 FE개발자😺

0개의 댓글