Generator & yield | yield* | return
- -
๋ชจ๋ ํฌ์คํ ์ ์ธํ๋ฐ ECMAScript6: ๋น ๋ฅด๊ฒ ๋ฐฐ์ฐ๋ ES6 ์คํฌ๊ณผ ๋น๋๊ธฐ ํ๋ก๊ทธ๋จ ์ ๋ด์ฉ์ ๋ด๊ณ ์์ผ๋ฉฐ
์ถ์ฒ๋ ์๋์ ์ฃผ์๋ก "๊นํํ"๋์ ์๋ฃ์ ๋๋ค.
์์ ์ ์ธ ์๋๊ฐ ์๋ ๊ณต๋ถํ ๊ฒ์ ์ ๋ฆฌํด๋๋ ๋ชฉ์ ์ผ๋ก ํฌ์คํ ํ ๊ฒ์ ๋๋ค.
www.inflearn.com/course/es6-ecmascript-6
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 ๊ตฌ๋ฌธ์ ํตํด ์ฒ๋ฆฌํ ์๋ ์๋ค.
'Languages > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Asynchronous Programming | callback hell | Improved Method Practice (0) | 2021.02.15 |
---|---|
Promise & then | chaining & catch | all (0) | 2021.02.15 |
Rest Parameter | Map | Maplterator | Filtering & Set | Set (0) | 2021.02.15 |
Iterator & for-of | Symbol | [Symbol.iterator()] (0) | 2021.02.15 |
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค