์ƒˆ์†Œ์‹

Languages/Java Script

Generator & yield | yield* | return

  • -
๋ฐ˜์‘ํ˜•

๋ชจ๋“  ํฌ์ŠคํŒ…์€ ์ธํ”„๋Ÿฐ ECMAScript6: ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šฐ๋Š” ES6 ์Šคํ‚ฌ๊ณผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ ์˜ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ

์ถœ์ฒ˜๋Š” ์•„๋ž˜์˜ ์ฃผ์†Œ๋กœ "๊น€ํ˜•ํƒœ"๋‹˜์˜ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. 

์ƒ์—…์ ์ธ ์˜๋„๊ฐ€ ์•„๋‹Œ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ด๋†“๋Š” ๋ชฉ์ ์œผ๋กœ ํฌ์ŠคํŒ… ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

www.inflearn.com/course/es6-ecmascript-6

 

ECMAScript 6: ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šฐ๋Š” ES6 ์Šคํ‚ฌ๊ณผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์ธํ”„๋Ÿฐ

๋น„๋™๊ธฐ ํ™˜๊ฒฝ์—์„œ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ES6์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šคํ‚ฌ์„ ํ–ฅ์ƒ์‹œ์ผœ ๋ณด์„ธ์š”. ์ดˆ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ES6 ์˜จ๋ผ์ธ ๊ฐ•์˜ abcdefghijk

www.inflearn.com


1. Generator & yieId

# Generator

funtion* ํ‚ค์›Œ๋“œ๋กœ ์ •์˜ํ•˜๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋Š” Generator ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Generator ๊ฐ์ฒด๋Š” iterableํ•œ Iterator๊ฐ์ฒด์ด๋‹ค.(์ˆœํšŒ ๊ฐ€๋Šฅํ•œ)

 

ํ•จ์ˆ˜์˜ ๋ ๋ถ€๋ถ„๊นŒ์ง€ ๋ชจ๋‘ ์ˆ˜ํ–‰๋œ ์ดํ›„, generatorํ•จ์ˆ˜์—์„œ return์„ ์‚ฌ์šฉ, ์—๋Ÿฌ ๋ฐœ์ƒ 

์œ„ ์„ธ๊ฐ€์ง€์˜ ๊ฒฝ์šฐ ์ข…๋ฃŒ๋œ๋‹ค.

 

์ด ๊ฐ์ฒด๋Š” ์ผ์‹œ์ •์ง€์™€ ์žฌ์‹œ์ž‘ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

 

function* intro(name){
    yield name + " ๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”";
    yield "APPle ์ง€์›์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค";
    yield "๋„์›€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ธ์ œ๋“  ๋ฌธ์˜ ์ฃผ์„ธ์š”";
    yield "๋ฐ”์ด๋ฐ”์ด";
}

์œ„์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ์ ์€ function๋’ค์— ์—์Šคํฌ๋ฆฌ์ŠคํŠธ ์ฆ‰ (" * ")๋ณ„ํ‘œ ๋ชจ์–‘์ด ๋ถ™์€ ํ˜•ํƒœ์˜ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

# yield 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜์—๋Š” yieldํ‚ค์›Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

yield๊ตฌ๋ฌธ์˜ ๋ฌธ๋ฒ•์€ return๋ฌธ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์˜ ์‹คํ–‰์„ ๋ฉˆ์ท„๋‹ค๊ฐ€ ๋‹ค์Œ์— ๋‹ค์‹œ ์ด์–ด์„œ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋‹ค.

 

์ด์ œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋ณด์ž.

function* intro(name){
    console.log("ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.");
    yield name + " ๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”";
    yield "APPle ์ง€์›์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค";
    yield "๋„์›€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ธ์ œ๋“  ๋ฌธ์˜ ์ฃผ์„ธ์š”";
    yield "๋ฐ”์ด๋ฐ”์ด";
}
let iter = intro("haeun");
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());

 

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉˆ์ถฐ์ง„ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฆฌํ„ด๋œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ(๋ฐ˜๋ณต์ž) ์ด๋ฉฐ, ์ด๊ฒƒ์€ haeun์„ ๊ฐ€๋ฅดํ‚จ๋‹ค.

> offbyone.tistory.com/83  ๋ฌธ๋ฒ•๋งŒ ์ตํžˆ๊ธฐ์—” ์˜† ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

์ดํ„ฐ๋ ˆ์ดํ„ฐ(๋ฐ˜๋ณต์ž)๋Š” next()๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ next()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ์‹คํ–‰์„ ์žฌ๊ฐœ ํ•ด yield๊ตฌ๋ฌธ๊นŒ์ง€ ์‹คํ–‰์ด ๋˜๊ณ , ๋‹ค์‹œ ์Šค์Šค๋กœ ์‹คํ–‰์„ ๋ฉˆ์ถ˜๋‹ค. 

 

๋‹ค์Œ์— next ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋‘๋ฒˆ์งธ yield๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ณ  ๋‹ค์‹œ, ๊ทธ ์ดํ›„๋ถ€ํ„ฐ ์‹คํ–‰์„ ์žฌ๊ฐœ ํ•œ๋‹ค

 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ์˜ ๋ฐ˜๋ณต์ด ๋๋‚˜๋Š” ์‹œ์ ์€ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 - ํ•จ์ˆ˜์˜ ๋ ๋ถ€๋ถ„๊นŒ์ง€ ๋ชจ๋‘ ์‹คํ–‰๋œ ๊ฒฝ์šฐ 
 - ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜์—์„œ return ์‚ฌ์šฉ 
 - ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

 

2. yieId *

# ์ฝ”๋“œ ์‹ค์Šต

function* mymy(){
    yield* [1,2,3,4,5,6,7];
    yield 8;
    yield 9;
}
let iterator = mymy();

for(const n of iterator){
    console.log(n);
}

 

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

yield value๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ๊ฐ€์ง€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด yield์— ๋ณ„์ด ๋ถ™์€ ํ˜•ํƒœ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น๋˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ’์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

# next(value)

๋‹ค์Œ ๊ฐ’์„ ์–ป๋Š” ์—ญํ• ์˜ ๋ฉ”์„œ๋“œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฐ”๋กœ ์ด์ „์˜ yield[expression]์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ

function* foo(){
    console.log(yield);
    console.log(yield);
    console.log(yield);
}
let fo = foo();
fo.next();
fo.next(1);
fo.next(2);
fo.next(3);
fo.next(4);

 

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

next ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ๊ฐ’์„ ์–ป๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ next๋ฉ”์„œ๋“œ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์˜ต์…˜์œผ๋กœ argument๋ฅผ ๋ฐ›๋Š” ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ next()์™€ ๋‹ค๋ฅด๊ฒŒ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ next()๋Š” ์ธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ ์“ฐ๊ณ , ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ’์„ ์ฝ๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์— ๊ฐ’์„ ์“ฐ๊ณ  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ ์ฝ์–ด ๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค.

 

3. return

#return(value)

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜จ ๊ฐ’์„ value๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , Generator์„ ์ข…๋ฃŒ

function* test(){	
    yield 1;
    yield 2;
    yield 3;
}
let t = test();
console.log(t.next());
console.log(t.return("๋ฉ”๋กฑ๋ฉ”๋กฑ"));
console.log(t.next());

 

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

return ๋ฉ”์„œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜จ ๊ฐ’์„ value๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด return๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์— done: ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด true๋กœ ์ฐํ˜€์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ next()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ์ด๋ฏธ ์ข…๋ฃŒ๋œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

# throw(exception)

์ธ์ž๋กœ ๋ฐ›์€ ์—๋Ÿฌ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , generator๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

 

function* generator(){
	try{
    	yield 'foo2';
    }
    catch(err){
    	console.log(err.message);
    }
}

let iterator = generator();

let foo2 = iterator.next();
console.log(foo2.value);

let nextThing = iterator.throw(new Error('bar'));

 

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

throw ๋ฉ”์„œ๋“œ๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋‚ด๋ถ€์˜ catch ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.