js

javascript Generator

์œถโ‰ 2022. 11. 2. 17:46

* Generator: ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ค‘๊ฐ„์— ๋ฉˆ์ท„๋‹ค๊ฐ€ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ. function ์˜†์— *์„ ์“ฐ๊ณ  ๋‚ด๋ถ€์— yield ํ‚ค์›Œ๋“œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ yield ์—์„œ  ํ•จ์ˆ˜ ์‹คํ–‰์„ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Œ. Generator ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด generator์˜ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋จ. 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ์ž‘์—… ํ•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์™€์„œ next() ํ•ด์ฃผ๋ฉด ์ง„ํ–‰์ด ๋ฉˆ์ท„๋˜ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ด์–ด์„œ ์‹คํ–‰

- generator ๊ฐ์ฒด๋Š” next(), return(), throw() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

* next๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด yield 1์„ ๋งŒ๋‚ ๋•Œ ๊นŒ์ง€ ์‹คํ–‰๋˜๊ณ  ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ๋ฐ˜ํ™˜.

function* fn(){
  console.log(1);
  yield 1;
  console.log(2);
  yield 2;
  console.log(3);
  console.log(4);
  yield 3;
  return "finish";
}
const a = fn();
//a โ–ถ fn {<suspended>}

๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” value์™€ done ํ”„๋กœํผํ‹ฐ

- value: yield ์˜†์— ์žˆ๋Š” ๊ฐ’. ๋งŒ์•ฝ ๊ฐ’์„ ์ƒ๋žตํ•  ์‹œ undefined๋กœ ๋œธ

- done: ํ•จ์ˆ˜ ์ฝ”๋“œ์˜ ์ข…๋ฃŒ๋ฅผ ๋‚˜ํƒ€๋ƒ„. ๋๋‚ฌ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false.

* return(): ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ returen ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๊ทธ ์ฆ‰์‹œ done ์†์„ฑ๊ฐ’์ด true๊ฐ€ ๋จ. ์ดํ›„ next๋ฅผ ์‹คํ–‰ํ•˜์—ฌ๋„ value๊ฐ’์€ ์–ป์„ ์ˆ˜ ์—†๊ณ  true๋กœ ๋‚˜ํƒ€๋‚จ. 

 

 

 

 

*throw();: return๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ done์„ true๋กœ ๋ฐ”๊ฟˆ

 

 

 

 

- iterable: Symbol.iterator ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ iterator๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•จ

โ—Ž iterator: next ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ next ๋ฉ”์„œ๋“œ๋Š” value์™€ done ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ž‘์—… ์™„๋ฃŒ ํ›„ done์€ true๊ฐ€ ๋จ.

๋ฐฐ์—ด์€ Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ˜ธ๋‚˜ํ•˜๋Š” ๊ฐ’์ด iterator์ด๋ฏ€๋กœ iterable ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ

=> ๋ฐฐ์—ด์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด.

๋˜ํ•œ for of๋ฅผ ์ด์šฉํ•ด ์ˆœํšŒ๋„ ๊ฐ€๋Šฅ

 

 

 

 

๋ฌธ์ž์—ด๋„ ํ•ด๋‹นํ•จ

- next()๋Š” ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์„์ˆ˜๋„ ์žˆ์Œ

function* fn(){
  const num1 = yield "์ฒซ๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”";
  console.log(num1);
  const num2 = yield "๋‘๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”";
  console.log(num2);
  return num1 + num2;
}
const a = fn();

- ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘์ง€ ์•Š์Œ. ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ๊ฐ’์„ ์—ฐ์‚ฐํ•ด์„œ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ . ๊ทธ๋ž˜์„œ while(true)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌดํ•œ๋ฐ˜๋ณต ๊ฐ€๋Šฅ.

function* fn(){
  let index = 0;
  while(true){
    yield index++;
  }
}
const a = fn();

- yield*๋ฅผ ์ด์šฉ. ๋ฐ˜๋ณต๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Œ.

function* gen1(){
  yield "H";
  yield "i";
  yield "!";
}
function* gen2(){
  yield "hi";
  yield* gen1();
  yield "XD";
}

 

'js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

javascript async, await  (0) 2022.11.01
javascript ํ”„๋กœ๋ฏธ์Šค (Promise)  (0) 2022.11.01
javascript ํด๋ž˜์Šค(class)  (0) 2022.11.01
javascript ์ƒ์†, ํ”„๋กœํ† ํƒ€์ž…(Prototype)  (0) 2022.10.31
javascript ๋ฉ”์„œ๋“œ call, apply, bind  (0) 2022.10.31