header-img
Info :
728x90

์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๊ฐ’(ํ˜น์€ return ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Œ)๋งŒ์„ ๋ฐ˜ํ™˜.

but.

์ œ๋„ˆ๋ ˆ์ดํ„ฐ(generator)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ํ•„์š”์— ๋”ฐ๋ผ ํ•˜๋‚˜์”ฉ ๋ฐ˜ํ™˜(yield)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

generator๊ณผ iterable ๊ฐ์ฒด๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ data stream์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•จ.

 

* ์ดํ„ฐ๋Ÿฌ๋ธ”(iterable)
- ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ(iterable, ์ดํ„ฐ๋Ÿฌ๋ธ”) ๊ฐ์ฒด๋Š” ๋ฐฐ์—ด์„ ์ผ๋ฐ˜ํ™”ํ•œ ๊ฐ์ฒด. ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ๊ฐ์ฒด์—๋“  for..of ๋ฐ˜๋ณต๋ฌธ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋ฐฐ์—ด์ด ๋Œ€ํ‘œ์ ์ธ ์ดํ„ฐ๋Ÿฌ๋ธ”์ž„. ๋ฐฐ์—ด ์™ธ์—๋„ ๋‹ค์ˆ˜์˜ ๋‚ด์žฅ ๊ฐ์ฒด์˜ ๋ฐ˜๋ณต๋„ ๊ฐ€๋Šฅ. 

[ ์ดํ„ฐ๋ ˆ์ดํ„ฐ iterator : obj[Sysbol.iterator]์˜ ๊ฒฐ๊ณผ. ์ด์–ด์ง€๋Š” ๋ฐ˜๋ณต ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ]

** ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ทœ์•ฝ
for..of ๋ฐ˜๋ณต ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด(๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด)๋ฅผ ๋ฐ˜๋ณตํ•  ๋•Œ ๊ฐ’์ด ์—ด๊ฑฐ๋˜๊ณ  ๋‚ด๋ถ€์—๋Š” @@iterator ๋ฉ”์„œ๋“œ๊ฐ€ ๊ทธ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์•ผ ํ•จ.

Sysbol.iterator() == @@iterator 

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์˜ ๋‚ด์žฅ ๊ฐ์ฒด์ธ Array, String, Map, Set, Arguments ๋“ฑ์ด ์ด ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ทœ์•ฝ์„ ๋”ฐ๋ฅธ๋‹ค.

 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด '์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜'๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํŠน๋ณ„ํ•œ ๋ฌธ๋ฒ• ๊ตฌ์กฐ์ธ function* ์ด ํ•„์š”ํ•œ๋ฐ.. 

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

ํ˜•์‹์œผ๋กœ ์„ ์–ธํ•˜๊ณ , ํ•˜๋‚˜์”ฉ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š”

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

let generator = generateSequence();

let one = generator.next();

alert(JSON.stringify(one)); // {value: 1, done: false}

์ด๋Ÿฐ ์‹์œผ๋กœ JSON.stringify() ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋ณด๋„๋ก ํ•˜์ž.

์ •์˜ํ•  ๋•Œ์—๋Š” yield / ๊ฐ’์„ ์–ป์–ด์˜ฌ ๋•Œ์—๋Š” next , return , throw

1. next : ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค, "์ƒˆ๋กœ์šด yield"์˜ ๊ฐ’๊ณผ "์•ž์œผ๋กœ yieldํ•  ๊ฐ’์ด ๋” ๋‚จ์•˜๋Š”์ง€์˜ ์—ฌ๋ถ€"๋ฅผ ๋ฐ˜ํ™˜.

   {value: ,done: false/true} ์˜ ํ˜•ํƒœ๋กœ ๊ฐ’ ๋ฐ˜ํ™˜

2. return : ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ข…๋ฃŒ.

   {value: ์ธ์ˆ˜, done:true} ๋ฅผ ๋ฐ˜ํ™˜

3. throw: ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ข…๋ฃŒ.

   - ์—ฌ๊ธฐ์„œ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— try~catch ๋ฌธ์œผ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

function* fun(){
	console.log('์ œ๋„ˆ๋ ˆ์ดํ„ฐ fun ์‹คํ–‰');
    try{
    	yield 1;
        yield 2;
        yield 3;
    } catch(e) {
    	console.error(e);
    }
}

const f= fun();
console.log(f.next());
console.log(f.throw('error message test');
console.log(f.next());

> {value: 1, done:false}

> error message test

> {value: undefined, done:true}

> {value: undefined, done: true}

 

======

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด, ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ํŠนํžˆ ๋ฌดํ•œ๋ฃจํ”„์—์„œ ๅคš ํ™œ์šฉ..

- ๋ฌดํ•œ์ˆ˜์—ด, ๋ฌดํ•œ ์Šคํฌ๋กค ๋“ฑ.. ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ

const fibonacci = (function* () {
	let[pre, cur] = [0,1];
    while(true) {
    	[pre, cur] = [cur, pre+cur];
        yield pre;
    }
})();

for (const num of fibonacci) {
	if (num>1000) break;
    console.log(num);
}

์ด๋Ÿฐ ํŒจํ„ด์ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋‹ˆ ๋ฉ”๋ชจํ•ด๋‘๋ฉด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. feat. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด..

 

 

 

[ ์ฐธ๊ณ  ]

https://blog.naver.com/tombyun/222444048304

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ! ์กฐ๊ธˆ์”ฉ ๋Š์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด, ๋จผ์ € ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ด. ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๋ช…๋ น๋ฌธ์„ ์ค‘๊ด„ํ˜ธ{ ...

blog.naver.com

https://ko.javascript.info/generators

 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ

 

ko.javascript.info

 

๋”๋ณด๊ธฐ
FRONTEND/React