제네릭 클래스

woodstock·2024년 2월 2일
0
post-thumbnail

제네릭 클래스

// 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"]);
profile
해내는 사람

0개의 댓글