Skip to content

Latest commit

 

History

History
103 lines (72 loc) · 1.98 KB

File metadata and controls

103 lines (72 loc) · 1.98 KB

4. 제네릭 클래스

제네릭 클래스

먼저 제네릭이 아닌 간단한 Number 타입의 리스트를 생성하는 클래스를 하나 만듬

class NumberList {
  constructor(private list: number[]) {}

	push(data: number) {
    this.list.push(data);
  }

  pop() {
    return this.list.pop();
  }

  print() {
    console.log(this.list);
  }
}

const numberList = new NumberList([1, 2, 3]);

→ list 필드를 private으로 설정해 클래스 내부에서만 접근할 수 있도록 만들고, 생성자에 필드 선언과 함께 초기화함

→ 새로운 요소를 추가하는 push, 제거하는 pop, 출력하는 print 메서드도 만들어주었음


그런데 만약 이때 StringList 클래스도 하나 필요하다면 어떻게 해야할까?

→ 제네릭이 없으면 클래스를 하나 더 만들어줘야 함…

class NumberList {
  constructor(private list: number[]) {}
	(...)
}

class StringList {
  constructor(private list: string[]) {}

	push(data: string) {
    this.list.push(data);
  }

  pop() {
    return this.list.pop();
  }

  print() {
    console.log(this.list);
  }
}

const numberList = new NumberList([1, 2, 3]);
const numberList = new StringList(["1", "2", "3"]);

엄청나게 비효율 적인 것을 볼 수 있음

→ 이럴 때 다음과 같이 제네릭 클래스를 사용해 여러 타입의 리스트를 생성할 수 있는 범용적인 클래스를 정의하면 됨

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]);
const stringList = new List(["1", "2"]);

만약 타입변수의 타입을 직접 설정하고 싶다면 다음과 같이 하면 됨

class List<T> {
  constructor(private list: T[]) {}

  (...)
}

const numberList = new List<number>([1, 2, 3]);
const stringList = new List<string>(["1", "2"]);