๐Ÿ’ก Generic(์ œ๋„ค๋ฆญ)์ด๋ž€?

Jake_Youngยท2021๋…„ 3์›” 17์ผ
1
post-thumbnail

์šฐ์„  ์ด ๊ธ€์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ํ† ๋Œ€๋กœ ํ•˜์˜€์Œ์„ ๋ฐํž™๋‹ˆ๋‹ค.
์ข‹์€ ๊ธ€ ์จ์ฃผ์‹  DailyEngineer๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
https://hyunseob.github.io/2017/01/14/typescript-generic/

๐ŸŒธ ๋ฌธ์ œ์˜ ์ฝ”๋“œ

function getFirst<T extends Stack<U>, U>(container: T): U {
  const item = container.pop();
  container.push(item);
  return item;
}
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์“ฐ๋‹ค๋ณด๋ฉด ๋งŒ๋‚˜๋Š” ๊บฝ์‡ 
  • ๋„ˆ๋ฌด ๊ถ๊ธˆํ•ด์„œ ๊ฒ€์ƒ‰ํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ฒซ๋ฒˆ์งธ๋กœ ์ฐพ์€ ๋ธ”๋กœ๊ทธ๊ฐ€ ์ œ๋„ค๋ฆญ์˜ ์˜์˜์™€ ์˜ˆ์ œ๋ฅผ ์ž˜ ์„ค๋ช…ํ•ด์ฃผ์—ˆ๋‹ค.
  • ๊นŒ๋จน๊ธฐ ์ „์— ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•  ๊ฒธ ๊ธ€์„ ์“ด๋‹ค.

โ˜˜๏ธ ์ œ๋„ค๋ฆญ์˜ ์˜์˜

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋‹ฌ๋ฆฌ ํƒ€์ž…์„ ๊ฐ•์ œํ•˜๊ณ  ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ด๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€๋”์€ ์ผ๋ฐ˜์ ์ธ string์ด๋‚˜ number๋ผ๊ณ  ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด Array์— ๋ฌธ์ž์—ด๊ณผ ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜ ๋ชจ๋‘๋ฅผ ๋ฐ›๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ 'a'์™€ 1 ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์˜ ์ธ์ž๋ฅผ ์„ž์–ด ๋ฐ›๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
  • any ํ˜•์œผ๋กœ ๋ฐ›์•„๋„ ์ข‹์ง€๋งŒ, ๊ทธ๋Ÿฌ๋ฉด ๋‘˜ ๋ชจ๋‘๋ฅผ ๋ฐ›๊ฒŒ ๋˜์ง€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋กœ๋งŒ ํ•„ํ„ฐ๋งํ•ด์„œ ๋ฐ›๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋˜ํ•œ any๋กœ ํ•˜๋ฉด vscode์™€ ๊ฐ™์€ ์—๋””ํ„ฐ์—์„œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•œ method ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ด๋Ÿด ๋•Œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ธ€๋กœ๋งŒ ์ฝ์–ด์„œ๋Š” ์ดํ•ด๊ฐ€ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— DailyEngineer๋‹˜์˜ ๋ธ”๋กœ๊ทธ์— ์žˆ๋Š” ์˜ˆ์ œ๋ฅผ ๊ฐ™์ด ์‚ดํŽด๋ณด์ž

๐ŸŒท ์˜ˆ์ œ ์ฝ”๋“œ


class Stack<T> {
  private data: T[] = [];
  constructor() {}

  push(item: T): void {
    this.data.push(item);
  }

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

const numberStack = new Stack<number>();
const stringStack = new Stack<string>();
numberStack.push(1);
stringStack.push('a');
  • ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์“ฐ๋ฉด ์ด์ œ ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ™์€ ํƒ€์ž…๋งŒ ์ €์žฅํ•˜๊ณ  ๋ฆฌํ„ดํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ T๋Š” ์ž‘์„ฑ์ž๊ฐ€ ์ž„์˜๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ช…์ด๋‹ค.
  • ๋‹ค๋งŒ ์ปจ๋ฒค์…˜์— ๋”ฐ๋ผ Type variables์˜ ์ฒซ ๊ธ€์ž๋ฅผ ๋”ด T๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
  • T,U,V,W,X,Y,Z T๋ฅผ ์“ด ์ดํ›„์—๋Š” ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ์— ๋งž์ถฐ ๊ทธ ๋‹ค์Œ ๊ฒƒ๋“ค์„ ์“ฐ๋ฉด ๋œ๋‹ค.
  • ์ด๋Š” ๋งˆ์น˜ ์ˆ˜ํ•™์—์„œ i, j, z ๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
function first<T>(arr: T[]): T {
  return arr[0];
}

first<number>([1, 2, 3]); // ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•


function toPair<T, U>(a: T, b: U): [ T, U ] {
  return [ a, b ];
}; // ๋‘ ๊ฐ€์ง€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•


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

getFirst<Stack<number>, number)(numberStack); // ์ƒ์†๋œ ํƒ€์ž… ๋ณ€์ˆ˜
profile
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํŒŒ์ด์ฌ ๊ทธ๋ฆฌ๊ณ  ์ปดํ“จํ„ฐ์™€ ๋„คํŠธ์›Œํฌ

0๊ฐœ์˜ ๋Œ“๊ธ€