CodeSpitz78 2/ ๋ฃจํด ์ฌํ
๐๐๐
๐ฅ ์ฝ๋์คํผ์ธ ์์ ์ ์๊ฐํ๋ฉด์ ๋ณต์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ์ต๋๋ค. ๊ณต๋ถ ํ์๋ ํ์ด์ ์ฌ์ด ์ธ์ด๋ก ์ค๋ช ํ ์ ์๋๋ก ์ฐ์ตํ์.
1. ์ฐธ์กฐ ์ ํ์ ๋ฌธ์
- LA๋ ๊ฐ์ ์ ์ผ๋ก B๋ฅผ ๋ฌผ๊ณ ์๋ค.
- ์ํธ ์ฐธ์กฐ(์ฐ์์ฐธ์กฐ)๊ฐ ๋์ด์ ์๋ก ์ค์ผ์ด ๋๋ค..
- ๋๋ฒ๊น ์ด ์ด๋ ค์์ง๋ค.
- ์ฐธ์กฐ๊ฐ์ ์ ์ฒด๋ฅผ ์ค์ผ์ํค๊ธฐ ์ฝ๋ค.
- ๋ณต์ฌ๋ณธ์ ๋๊ฒจ์ผํ๋ค.
2. ์๋ธ๋ฃจํด์ ์ฒด์ธ
keep์ ์ ํํ ๋์
- ์ธ์์ ์ง์ญ๋ณ์๋ฅผ ํฌํจํ๋ ๊ณณ: ์คํ์ปจํ์คํธ
- ํจ์ ์ฝ์ return ์ดํ๋ก ์ฎ๊ฒผ๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ ํ์๊ฐ ์์ผ๋, ๋ฆฌํดํฌ์ธํธ๋ฅผ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ง์ ํด์ฃผ๋ฉด ์ด๋จ๊น?
- ๋ฆฌํดํฌ์ธํธ๋ ์ธ์ด ์์ค์์ ์ ํด์ ธ์๋ค.
- ๋ฆฌํดํฌ์ธํธ๋ฅผ ์ฒ์ ํธ์ถํ ํจ์๋ก ์ฎ๊ธด๋ค => tail recursion
- ์ธ์ด์์ค์์ ๋ฆฌํดํฌ์ธํธ๋ฅผ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ์ธ์ด๋ง๋ค ์ฌ๊ท๊ผฌ๋ฆฌ ์ต์ ํ๋ฅผ ์ง์ํ๋ ์ธ์ด๋ ์๊ณ , ์๊ธฐ๋ ํ๋ค.
- ์ ์ด๋ฌธ์ loop ์ฒ๋ผ ์ฎ๊ธด๋ค.
- ์ฒ๋ฆฌํ๊ณ => ํด์ ํ๊ณ
- ์ ์ด๋ฌธ์ for๋ฌธ์ ๋๋๋ง๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ์ง ์๋๋ค.
- index ๋ณ์๋ง ๋จ์ ์๋ค.
- ์ ์ด๋ฌธ์
stack clear๊ตฌ๋ฌธ. - for๋ฌธ์ ์ฒ์ loop๋๋ฆฌ๋ ๋ธ๋ญ์ ๋ํด์ ์คํ์์ญ์ ๋ํด์ ์คํํ ๋ค์์ ์ ํ์, ์์ stack ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ถ ํด์ ํ๋ค.
3. ์ฌ๊ท ๊ผฌ๋ฆฌ ์ต์ ํ Tail Recursion - for๋ฌธ์ ๋์์ ๋ฐ์ง ์๊ณ ๋ ๊ณ ์ฑ๋ฅ์ ๋ฃจํ๋ฅผ
๋ง๋ค์ด ๋ผ ์ ์๋ค. - ์ฌํ๋ฆฌ๊ฐ ์ง์ํ๊ณ ์๋ค. ํฌ๋กฌ X, ์ฃ์ง X - tail recursion์ ์ง์ํ๋ค. - script time out๋ง ๋๋ค. - stack over flow๋ ์ผ์ด๋์ง ์๋๋ค. - ์ธ์ด๋ง๋ค tail recursion์ด ์ด๋ค์ง๋ ์กฐ๊ฑด์ ์ ์ํด ๋๋ค. - ํจ์จ์ ์ธ ์ฌ๊ทํจ์๋ฅผ ์งค ์ ์๋ค.
** *์์ **
const sum = v => v + (v ? sum(v - 1) : 0);
sum(3);
// 1. 3 + sum(2)
// 2. 2 + sum(1)
// 3. 1 + 0- ๋ํ๊ธฐ ์ฐ์ฐ์๋ ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ ์ต์ ํ๋ฅผ ๋ฐฉํดํ๋ค.
- ๋ชจ๋ ์ฐ์ฐ์๋ ์คํ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฑํ๋ค.
์ธ์๋ก ์ฎ๊ฒจ์ ์คํ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ธฐ์ง ์๋๋ก ํ์๋ค.
์ฐ์ฐ์ ์ธ์๋ก ์ฎ๊ธด๋ค!!
const sum = (v, prev = 0) => {
prev += v;
return v > 1 ? sum(v - 1, prev) : prev;
};
sum(3);
// 1. sum(v:3, prev:0) return sum(2,3)
// 2. sum(v:2, prev:3) return sum(1,5)
// 3. sum(v:1, prev:5) reutrn 6
// 3๋ฒ์งธ return๊ฐ์ด ์ฒซ๋ฒ์งธ sum(3)์ ๋ฆฌํดํฌ์ธํธ๋ก ๋ฆฌํด๋๋ค.์๋ฐ์คํฌ๋ฆฝํธ์์ tail recursion ์ ์ผ์ผํค๋ ์ฐ์ฐ์ (์ธ์ด์์ค์์ ์ ์๋์ด์์)
- ์ผํญ์ฐ์ฐ์
&&์ฐ์ฐ์||์ฐ์ฐ์
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ฏธ ES6์์๋ tail recursive๋ฅผ ์ง์ํ๊ฒ๋ ์คํ์ผ๋ก ์ง์ ํด๋์๋ค. JVM์ ์ง์ํ์ง ์๋๋ค.
- ๋ด ๋ฉ๋ชจ๋ฆฌ๋ ๋ค ํด์ ํ๊ณ ๋ค์์ชฝ ํจ์๋ฉ๋ชจ๋ฆฌ์ ์ธ์๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ํด๊ฒฐํ๋ค.
- ํจ์ ์ธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ์๋ค.
- ์์ prev๋ ์ธ์ ๋ฉ๋ชจ๋ฆฌ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
- for๋ฌธ์ ์ง์ญ๋ณ์๋ ์ธ์ ๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ๋ณผ ์ ์๋ค.
- for๋ฌธ์ ์ง์ญ๋ณ์์ ๊ฐฑ์ ํ๋ ๋ก์ง๊ณผ ๊ฐ์๊ฐ๋ ์ด๋ค.
4. ๐๐ ์ฌ๊ท๋ฅผ ๋ฃจํ๋ก Tail Recursion to loop - ์์ ๋กญ๊ฒ ๋ณํํ ์ ์์ด์ผ ํ๋ค. -
์๋์ผ๋ก ๋ณํํ ์ ์์ด์ผ ํ๋ค..
const sum = (v, prev = 0) => {
prev += v;
return v > 1 ? sum(v - 1, prev) : prev;
};const sum = v => {
let prev = 0;
while (v > 1) {
prev += v;
v--;
}
return prev;
};5. โจํด๋ก์ โจ - ์ธ์ด์ ์ธ ์ฅ์น๋ผ๊ณ ์๊ฐํ์.
5-1. Static state
- ์ด๋ ๊ฒ ์๋ํ๋ ๋ํ์ ์ธ ์ธ์ด๊ฐ C์ธ์ด์ด๋ค. - ๋ฃจํด์ ๋ง๋๋
๊ฒ์ด ๋ฌธ์ผ๋ก ๋์ด์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ๋ณ์์ ๋์
ํ ์ ์๋ ๊ฐ์ด ์๋๋ค. - ์๋ธ๋ฃจํด์ ๊ฐ์
ํํ๋ก ๋ง๋ค์ด๋ด๋ ์ธ์ด๊ฐ ์๊ณ , ๋ฌธ์ผ๋ก ๋ง๋ค์ด๋ด๋ ์ธ์ด๊ฐ ์๋ค. - ์๋ฐ์ ๋ฉ์๋๋ ๋ฌธ์ด๋ค. ํด๋์ค
๋ด๋ถ์์๋ง ์ ์ธ๋์ด์ผํ๋ค. ์ธ๋ถ์์ ๋์
๋ ์ ์๋ค. - ๊ฐ์ผ๋ก ๋ง๋ค ์ ์์ผ๋ฉด ์คํ ์ค๊ฐ์ ๋ฃจํด์
๋ง๋ค์ด ๋ผ ์ ์๋ค. - ๋๋ค - ๋ฃจํด์ ๋๋ค๋ก ๋ณผ๋. - c์ธ์ด์ ํจ์ํฌ์ธํฐ์์ ๋ฐ์ ํด์จ ๊ฐ๋
. - ๋ฐํ์์
์๋ธ๋ฃจํด์ ๋ง๋ค ์ ์๋ค.
ํด๋ก์ ๋ ์ค์ง ๋ฐํ์ ์ค์ ๋ฃจํด์ ๋ง๋ค ์ ์๋ ์ธ์ด์์ ์๊ฒจ๋๋ค. - c์์๋ static ๋ฉ๋ชจ๋ฆฌ - ๊ทธ๋ ๋ค๊ณ ์ด๋ฐ์ํฉ์์ ๋ชจ๋ ์ธ์ด๊ฐ ํด๋ก์ ๋ฅผ ์์ฐํ์ง ์๋๋ค.. - ์ธ์ด ๋์์ด๋๊ฐ ์ด๋ป๊ฒ ๊ฒฐ์ ํ๋์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. - ํจ์๋ฅผ ๋ฌธ์ผ๋ก ๋ง๋๋ ์ธ์ด์ ํน์ฑ
5-2. Runtime state
=> ์ฐ๋ฆฌ๊ฐ ์ง ์ฝ๋๋ฅผ ๋ง๋๋ฉด =>
- ์คํ ์ค๊ฐ(๋ฐํ์)์ ๋ฃจํด์ ์ ์ ์์ฒด๊ฐ ํ์ด๋๋ค.
- ์๊ธฐ๊ฐ ํ์ด๋ฌ์ ๋์ ์๊ธฐ๊ฐ ๊ฐํ์๋ ๋ฐ์ค๋ฅผ ๋ฐ๋ผ๋ณผ ์ ์๋ ์ฌ์ง๊ฐ ์๊ธด๋ค.
- ๋ฐํ์์ ๋ฃจํด์ ๋ง๋ค ์ ์๋ ์ธ์ด๋ค์ ๋ฃจํด์ ๋ง๋ค๋ฉด ๋ฃจํด์ ๋ณด ์์ ์๊ธฐ๊ฐ ์ด๋์ ํ์ด๋ฌ๋์ง๋ฅผ ๊ธฐ๋กํ๋ค. => ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ค์ฝํ๋ผ๊ณ ์ ์ํ๋ค.
- ๋ฉ์ธ ๋ฃจํด์ flow๋ฅผ ๊ธฐ์ตํ๋ค. main flow๊ฐ ํ๋ฌ๊ฐ๋ ์ํฉ์ ์๊ณ ์๋ค.
- flow์์ ์๋ ์์ด๋ค์ ๊ธฐ์ตํ๊ฒ ๋๋ค.
- ๋ ธ๋๋ฐ์ค์ ๋ฑ์ฅํ์ง ์๋ ๋ชจ๋ ๋ณ์๋ฅผ ์์ ๋ณ์๋ผ๊ณ ํ๋ค.
- ์์ ๋ณ์๋ค์ routine๊ณผ ๋ฌด๊ดํ๊ฒ ์กด์ฌํ์ง๋ง routine์์ ์ฐธ์กฐํ ์ ์๋ค.
- routine์ด ํ๋ฒ์ด๋ผ๋ ์์ ๋ณ์๋ฅผ ๊ฐ๊ณ ์ค๊ฒ ๋๋ฉด ์์ ๋ณ์๋ค์ ๋ง์๋๋ก ํด์ง๋๊ฑฐ๋ ์กฐ์๋์ง ๋ชปํ๋ค. => routine์ด ๋ฌผ๊ณ ์๊ธฐ ๋๋ฌธ
- routine์ ์์ ๋ณ์๊ฐ ๊ฐํ๋ ๊ณต๊ฐ์ด๋ผ๊ณ ํ ์ ์๋ค.
- free variables close => closure
- ๋ง์ฝ ์ด ์ํฉ์์ F ๋ฉ์๋๊ฐ ์ธ๋ถ๋ก ์ ์ถ๋ ๊ฒฝ์ฐ main flow์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค ํด์ง๋์ง ๋ชปํ๋ค.
- ํด๋ก์ ๋ ์์ ๋ณ์์ ํด๋ก์ ์ด๋ค.
6. ์ค์ฒฉ ํด๋ก์ nested closure - ํด๋ก์ ๋ ๋ฃจํด๋ง์ด ๋ง๋ค์ด ๋ด๋ ๊ฒ์ด ์๋๋ค. -
ES6์์๋ block๋ง ์ฃผ์ด๋ ์ค์ฝํ๊ฐ ์์ฑ๋๋ค. - ์ค์ฝํ ์์ฑ์ ํด๋ก์ ๋ฅผ ๋ง๋๋ ํ์์ด๋ค. - block๋ง ์ฃผ์ด๋ ํด๋ก์ ๊ฐ ์์ฑ๋๋ค.
- ์ฐ์์ ์ธ ํด๋ก์ ๊ฐ ํ์ํ๋ค. - ์ค์ฒฉ๋์ด ์๋ ํด๋ก์ ๋ฅผ ๋ง๊ตฌ๋ง๊ตฌ
์์ฑ๋๋ค.
์ ๊ทธ๋ฆผ์ ์ฝ๋๋ก ํํํ๋ค๋ฉด..
window.a = 3; // main flow์ ์ ์ญ: global
if (a == 3) {
// ์ฒซ๋ฒ์งธ block
const b = 5;
const f1 = v => {
// ์ฒซ๋ฒ์งธ routine
const c = 7;
if (a + b > c) {
// ๋๋ฒ์งธ block
return p => v + p + a + b;
// ๋๋ฒ์งธ routine
// ์์ ๋ณ์๋ฅผ ๋ฌผ๊ณ ์์ => ํด๋ก์
} else {
return p => v + p + a + b;
}
};
}7. ์๋์
- ์ธต์ธต์ด ์ค์ฒฉ๋์ด์๋ ํด๋ก์ ๊ฐ ์๋๋ฐ ๊ฐ๊ฐ์ ํด๋ก์ ์์ ๋๊ฐ์
์ด๋ฆ์ ๋ณ์๋ฅผ ์์ ํ๊ณ ์์๋ ์ผ์ด๋๋ค.
const a = 3; // main flow์ A
if (a == 3) {
// block scope
const a = 5; // ?! a๊ฐ ๋ ์์.
const f1 = v => {
const a = 7; // ???!! a๊ฐ ๋์์!!
console.log(a);
};
}- ์๋์์ ์ง์ํ๋ ์ธ์ด๋ ๊ฐ์ฅ ๊ฐ๊น์ด์ ์๋ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ค.
- ์๋ธ๋ฃจํด์ด ๋ฐ์ ์๋ ์์ ๋ณ์๋ฅผ ์๊ฑด๋๋ฆฌ๊ฒ ํ๊ธฐ ์ํด์๋(๋ณดํธํ๊ธฐ ์ํด์๋) ์๋์ ๋ฐฉ์์
์ฌ์ฉํ๋ค.
- ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝํ๊ณ ํ ์ค์ฝํ์ ์์์ ์งํค๊ณ ํ ๋ณ์๋ช ์ ๊ฐ์ ๋ณ์๋ช ์ ์ฌ์ฉํ์ฌ ์งํจ๋ค.
- ์์ ์ฝ๋๋ ์๋ธ๋ฃจํด์์ ๋ ์์๋ก ๋ชป๊ฐ๋๋ก ๋ง์
const a = 3; // main flow์ A
if (a == 3) {
// block scope
const a = 5; // ๋ณดํธ๋ง์ ๋ง๋ ๊ฐ๋
const f1 = v => {
console.log(a); // ์๋ธ๋ฃจํด ์์์ a์ ์ ๊ทผ
};
}
8. ์ฝ๋ฃจํด
- ์ปค๋งจ๋ ํจํด
- ์คํํ๋ค๊ฐ ์ค๊ฐ์ ๋ฉ์ถ ์ ์์ง ์์๊น? ๋ผ๋ ์๊ฐ์ ๋๋ฌํจ
- ์คํํ๋ค๊ฐ ์ค๊ฐ์ ๋ฉ์ถ๊ณ => ๋ฆฌํดํฌ์ธํธ๋ก ๋ณด๋ด์!
- main flow์์ sub routine์ ๊ฐ๋ค๊ฐ 20๋ฒ์งธ์์ ๋ฉ์ถค => ๋ค์ main flow๋ก ํ๋ฆ => ๋ ๋ค์ sub routine์ 21๋ฒ์งธ์์ ์์ => ๋ค์ main flow๋ก ํ๋ฆ => ๋ ๋ค์ sub routine์ 50๋ฒ์งธ์์ ๋ฉ์ถค
- ์์ฑํ ๋ชจ๋ ๋ฌธ์ record๋ผ๋ ๊ฐ์ฒด๋ก ๊ฐ์ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ค.
- co routine <-> single routine
- ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ES6์ ์ ๋๋ ์ดํฐ์์ ๊ฐ๋ฅํ๋ค.
์ผ๋ฐ์ ์ธ ๋ฃจํด
- ์ฑ๊ธ๋ฃจํด์ ๋ฃจํด์ด ๋๊น์ง ์คํ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ค.
์ฝ๋ฃจํด
-
๋ฆฌํด๋ง๊ณ yield๋ฅผ ์ฌ์ฉํ๋ค. (์ธ์ด๋ง๋ค ํค์๋๊ฐ ๋ค๋ฅด๋ค.)
์๋ฐ์คํฌ๋ฆฝํธ์๋ C# ๋ฌธ๋ฒ์ด ๋ง์ด ๋ฐ์๋์ด์๋ค. (async await๋..)
-
yield์์ ๋์ด์ง๊ณ ๋ฆฌํดํฌ์ธํธ๋ก ๋์๊ฐ๋ค.
- yield์์๋ suspension(์ผ์์ ์ง)๊ฐ ์ผ์ด๋๋ค.
- suspension: ์ฝ๋ฃจํด์ ์ํด์ ๋ฉ์ถฐ์๋ ์ํ
- suspension์ ์ด์ฉํด์ ๋ช๋ฒ์ด๋ ์ง์ ํ๋ค๊ฐ ๋๊ฐ๋ค๊ฐ๋ฅผ ๋ฐ๋ณตํ ์ ์๋ค.
- ๋ฌธ์ธ๋ฐ๋ ๋ถ๊ตฌํ๊ณ **
suspension**๋ฅผ ๊ฑธ ์ ์๋ค.
์ฝ๋ฃจํด์ ์ด์ฉํด์ ์ข์ ์
- ์์ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ 3๊ฐ์ ํจ์๋ฅผ ์ฝํด์ผํ๊ธฐ ๋๋ฌธ์ R2์ 3๊ฐ์ง ๋ฒ์ ์ด ํ์ํ์ ๊ฒ์ด๋ค.
- 3๊ฐ์ง ๋ฒ์ ์ ํจ์๋ค์ด ๊ฐ์ ๊ณต์ ํด์ผํ๋ค๋ฉด ์๋ก ๋ฐ์ ๊ฐ๋ค์ ์ธ์๋ก ๋๊ฒจ์ค์ผํ์ ๊ฒ์ด๋ค.
- ๋๊ฒจ์ค์ผํ ์ธ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ ์ ๋ ๋ณต์กํ ๋ก์ง์ด ๋์์ ๊ฒ์ด๋ค.
- ์ฝ๋ฃจํด์ ์ด์ฉํ๋ฉด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ์ง์ญ๋ณ์๊ฐ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ฝ๋๊ฐ ํจ์ฌ ๋ ์ฌ์์ง๋ค.
๋ฃจํ์์ ์ฝ๋ฃจํด
- ๋ฃจํ ๋ด๋ถ์ yield๊ฐ ์์ ๊ฒฝ์ฐ ๋ฃจํ๊ฐ ์กฐ๊ฑด์ด ๋ง์กฑํ ๋๊น์ง ๋ฐ๋ณตํ๋ ๊ฒ์ด ์๋๋ผ yield์์ ๋ฉ์ถ๊ณ ๋ฐํํ๋ค.
- ๋๋ฒ์งธ๋ก ๋ค์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ด์ ์ ๋ฉ์ท๋ ๋ฐ๋ณต๋ฌธ์์ ๋ค์ ๋ฐ๋ณต๋ฌธ์ด ์์ํ๊ฒ ๋๋ค.
- ๋ฃจํ๊ฐ ๋๋๋ง๋ค ์งํํ๊ฒ ๋๋ค.
- ๋๋์ด ๋ฃจํ๋ฅผ ๋ฉ์ถ ์ ์๊ฒ ํ ๋ฐฉ๋ฒ์ด ์๊น.
์ ๋๋ ์ดํฐ
const generator = function* (a) {
a++;
yield a;
a++;
yield a;
a++;
yield a;
};
const coroutine = generator(3);- ์ ๋๋ ์ดํฐ ์์ฒด๋ ์ฝ๋ฃจํด์ด ์๋๋ค.
- ์ ๋๋ ์ดํฐ ํจ์๋ ์ ๋๋ ์ดํ ํ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์ฝ๋ฃจํด์ด ์๋๊ณ , ์ ๋๋ ์ดํฐ๋ฅผ ํธ์ถํ๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ด!! ์ฝ๋ฃจํด์ด๋ค.
- 3์ ์์์ธ ๊ฒ ์ฒ๋ผ ์ฝ๋ฃจํด์ด ๋ง๋ค์ด์ง๋ค. ์ฝ๋ฃจํด์ ์ธ์๊ฐ 3์ธ ๊ฒ์ ๊ธฐ์ตํ๊ณ ํ์ด๋๋ค.
let result = 0;
result += coroutine().value;
console.log(result);- ์ฝ๋ฃจํด์ iterator result object๋ฅผ ๋ฐํํ๋ค.
- ์ด ์ค๋ธ์ ํธ์๋ doneํค์ resultํค๊ฐ์ด ์กด์ฌํ๋ค.
- value์ ๊ฐ์ด ์กด์ฌํ๋ค.
- yield๋ก ์ถ๋ ฅ๋ ๊ฐ
let result = 0;
result += coroutine.next().value;
console.log(result); // 4- next()๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด ์ ์ง์ ์์ผ์ผํ๋ค.
๊ณผ์
๋ค์์ ์ฝ๋๋ ๊ตฌ๊ตฌ๋จ์ ์ถ๋ ฅํ๋ค. ์ด๋ฅผ ๋ง์กฑํ๋ ์ ๋ค๋ ์ดํฐ๋ฅผ ์์ฑํ์์ค.
const generator_Joy = function* (i, j) {
for (let a = 1; a < i + 1; a++) {
for (let b = 1; b < j + 1; b++) {
const c = a * b;
yield [a, b, c];
}
}
};
for (const [i, j, k] of generator_Joy(9, 9)) {
console.log(`${i} x ${j} = ${k}`);
}// ์ด๋ค ๋ถ์ ์์์ ํ๋ฆ
const generator_Aus1 = function* (i, j) {
for (let a = 1, b = 1; a < i; b++) {
if (b === j) {
a++;
b = 0;
}
yield [a, b, a * b];
}
};
const generator_Aus2 = function* (i, j) {
for (let a = 1, b = 1; a <= i; b++) {
if (b === j) {
a++;
b = 0;
}
yield [a, b, a * b];
}
};
const generator_Aus3 = function* (i, j) {
for (let a = 1, b = 1; a <= i; b >= j ? (b = 0 + !!a++) : b++) {
yield [a, b, a * b];
}
};