Fall in IT.

Typescript Generic이란? 본문

프로그래밍언어/Javascript & Typescript

Typescript Generic이란?

D.Y 2018. 8. 30. 23:11

안녕하세요.


오늘은 Typescript뿐만 아니라 정적타입 언어에서 자주 사용되는 Generic에 대해서 알아보도록 하겠습니다.



Generic이란?

  • Generic은 어떤 클래스 혹은 함수에서 사용할 타입을 그 함수나 클래스를 사용할 때 결정하는 프로그래밍 기법을 말한다.
  • 기본적으로 Java와 같은 정적 타입의 언어는 클래스 또는 함수를 선언하는 시점에서 매개변수 또는 리턴 타입을 지정해야 한다.이때, Generic을 사용하면 범용적인 매개변수 또는 리턴타입을 지정할 수 있다.

Javascript에서는 Generic이 없는 이유

  • Javascript는 원래 타입 선언이 필요하지 않고, 런타임 시점에 에러가 발생하기 때문에 Generic이 필요하지 않다.


Generic을 사용하는 이유

  • Stack 자료구조 예제

Generic 사용 전)

class Stack 
{
  private data: any[] = [];

  public constructor() { }

  private push (item: any): void 
  {
    this.data.push(item);
  }
  
  private pop(): any
  {
    return this.data.pop();
  }
}

// 사용
let stack = new Stack();
stack.push(1);
stack.push(2);
stack.pop().substr(0); // Error! (type을 알 수 없다)


Generic 사용 후)

class Stack<T> {

private data: T[] = [];


public constuctor() { }


private push(item: T): void

{

this.data.push(item);

}   


private pop(): T {     return this.data.pop();

}

} // 사용 let stack = new Stack<number>(); stack.push(1); stack.push(2); stack.pop().substr(0); // Compile Error! (컴파일 시점에 에러를 감지) let stack02 = new Stack<string>(); stack.push("abc"); stack.push("def"); stack.pop().substr(0); // Ok!


정리

  • 클래스명 뒤에 붙는 **<T>**는 제네릭(추상적 타입)을 사용하겠다는 의미로 자주 사용됩니다. 
  • T 대신 다른 이름을 사용하는 것도 가능합니다. 관용적으로 T(Type의 약자) 또는 U를 많이 사용합니다.
  • Generic을 사용하므로써, 컴파일러가 리턴하는 타입을 알 수 있게 됩니다. 즉, 컴파일 시점에 에러를 찾아낼 수 있습니다.


Generic 예제코드 1)

// Generic 사용 전
function toPair(a: any, b: any): [any, any] 
{
	return [a, b];
}

// Generic 사용 후
function toPair(T: any, U: any): [T, U]
{
	return [T, U];
}

// 사용
toPair<string, number>("abc", 123); //return ["abc", 123]


Generic 예제코드 2)

function getFirst<T extends Stack<U>, U>(container: T): U
{
	let item = container.pop();
	container.push(item);
	return item;
}


참조



모두 즐거운 코딩하세요~



Comments