Generator
์ ๋๋ ์ดํฐ ํจ์๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์์ฑํ๋ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ์ ์์ฐํ๋ ์๋๋ ์ ๊ตํ๊ฒ ์กฐ์ ํ ์ ์๋ค. ์ ๋๋ ์ดํฐ ํจ์๋ ๊ฒ์ผ๋ฅด๊ฒ ๋์(์ฆ, ์๋น์๊ฐ ์์ฒญํด์ผ๋ง ๋ค์ ๊ฐ์ ๊ณ์ฐ)ํ๊ธฐ ๋๋ฌธ์ ๋ฌดํ์ ๋ชฉ๋ก ์์ฑํ๊ธฐ ๊ฐ์ ๊น๋ค๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๋ค.)
์ ๋๋ ์ดํฐ ํจ์๋ ๋ค์์ฒ๋ผ ๋์ํ๋ค.
//ํจ์๋ช
์์ ๋ถ์ * ์ ์ด ํจ์๊ฐ ์ ๋๋ ์ดํฐ์์ ์๋ฏธํ๋ค.
//์ ๋๋ ์ดํฐ๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ฌ๋ธ ๋ฐ๋ณต์๊ฐ ๋ดํ
function* createFibonacciGenerator() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
//๋ค์ ํผ๋ณด๋์น ์ซ์๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด a์ b๋ฅผ, b์ a+b๋ฅผ ํ๋ฒ์ ๋ค์ ํ ๋นํ๋ค.
let fiboancciGenerator = createFibonacciGenerator();
//IterableIterator<number>
console.log(fiboancciGenerator.next()); //{ value: 0, done: false }
console.log(fiboancciGenerator.next()); //{ value: 1, done: false }
console.log(fiboancciGenerator.next()); //{ value: 1, done: false }
console.log(fiboancciGenerator.next()); //{ value: 2, done: false }
console.log(fiboancciGenerator.next()); //{ value: 3, done: false }
console.log(fiboancciGenerator.next()); //{ value: 5, done: false }
console.log(fiboancciGenerator.next()); //{ value: 8, done: false }
console.log(fiboancciGenerator.next()); //{ value: 13, done: false }
//createFibonacciGenerator ํจ์๋ IterableIterator๋ฅผ ๋ฐํํ๊ณ , ์ด ์ ๋๋ ์ดํฐ์ next๋ฅผ
//ํธ์ถํ ๋๋ง๋ค ๋ค์ ํผ๋ณด๋์น ๊ฐ์ ๊ณ์ฐํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์ถํ๋ค.
//ํ์
์คํฌ๋ฆฝํธ์์ ์ด ์ฝ๋๋ค์ ๋๋ฆฌ๋ฉด,
//ํ์
์คํฌ๋ฆฝํธ๊ฐ ๋ฐฉ์ถ๋ ๊ฐ์ ํ์
์ ์ด์ฉํด ๋ฐ๋ณต์ ํ์
์ ์ถ๋ก ํ๋ค.
- ์ ๋๋ ์ดํฐ๋ ์๊ตฌ์ ์ผ๋ก ๊ฐ์ ์์ฑํ ์ ์๋ค.
- ์ ๋๋ ์ดํฐ๋ yield๋ผ๋ ํค์๋๋ก ๊ฐ์ ๋ฐฉ์ถํ๋ค. ์๋น์๊ฐ ์ ๋๋ ์ดํฐ์ ๋ค์ ๊ฐ์ ์์ฒญํ๋ฉด(์:next ํธ์ถ), yield๋ฅผ ์ด์ฉํด ๊ฒฐ๊ณผ๋ฅผ ์๋น์์๊ฒ ๋ณด๋ด๊ณ , ์๋น์๊ฐ ๋ค์ ๊ฐ์ ๋ค์ ์์ฒญํ๊ธฐ ์ ๊น์ง๋ ์คํ์ ์ค์งํ๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋์ํ๋ฏ๋ก while(true) ๋ฃจํ๊ฐ ์์ํ ์คํ๋๋ค๊ฐ ๋น์ ์ ์ข ๋ฃ๋๋ ์ํฉ์ด ์ผ์ด๋์ง ์๋๋ค.
Generator๋ ํธ์ถ๋ ๋ Iterator๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ํน์ ํจ์
Generator ์ ์๋ ๋ณํ(*) ๋ฌธ์๋ก ํ์๋๊ณ yield ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ next() ๋ฉ์๋๋ฅผ ์ฐ์์ ์ผ๋ก ํธ์ถํ ๋ ๋ฐํํ ๊ฐ์ ๋ํ๋ธ๋ค.
์๋ง๋ Generator์ Iterator ์ค ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ ๋ณด๋ค ๊นจ๋ํ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ฝ๋ฐฑ์ ์ฌ์ฉํ๋ ๋์ ๋๊ธฐ์์ผ๋ก ๋ณด์ด๋ ์ฝ๋๊ฐ ์ค์ ๋ก yield๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ผ๋ก ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ๋ค.
์์ฝ : ํจ์์ ์คํ์ ์ค๊ฐ์ ๋ฉ์ท๋ค๊ฐ ์ฌ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ
์ฝ๊ฒ ๋งํด์ ์ ๋๋ ์ดํฐ๋ ๋ค๋ฅธ ์์
์ ํ๋ค๊ฐ ๋ค์ ๋์์์ next() ํด์ฃผ๋ฉด ์งํ์ด ๋ฉ์ท๋ ๋ถ๋ถ๋ถํฐ ์ด์ด์ ์คํ
- ๋ฉ์๋ :
next() : ์๋ณด๋ ์ง์ ๊ทธ ๋ค์์ผ๋ก ๋์ด๊ฐ ์ ์์
return(): done์ true๋ก ๋ฐ๊ฟ
throw(): done์ true๋ก ๋ฐ๊ฟ - Iterable(๋ป: ๋ฐ๋ณต์ด ๊ฐ๋ฅํ)์ด๋ฏ๋ก,
- Symbol.Iterator ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด ์์ด์ผ ํ๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ Symbol.iterator ํค๋ฅผ ๊ฐ๋ ์์ฑ์ด ์์ด์ผ ํจ
- Symbol.Iterator ๋ Iterator์ ๋ฐํํด์ผ ํ๋ค - Iterator
- next ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค
- next ๋ฉ์๋๋ value์ done ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ์์ ์ด ๋๋๋ฉด done์ true๊ฐ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก, Genertor์ Iterator ์ด๋ฉด์ Iterable์ด๋ค.
for..of ๊ตฌ๋ฌธ์ด ์ ๋์๊ฐ๋ค
for(let num of a){
console.log(num);
}
function* fn() {
yield 1;
yield 2;
yield 3;
return "finish";
}
const a = fn();
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();
์์ฑ์ ํจ์๋ function* ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์์ฑ. ์์ฑ์ ํจ์๊ฐ ์ต์ด๋ก ํธ์ถ๋ ๋, ํจ์ ๋ด๋ถ์ ์ด๋ ํ ์ฝ๋๋ ์คํ๋์ง ์๊ณ , ๋์ ์์ฑ์๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐ๋ณต์ ํ์ ์ ๋ฐํ. ์์ฑ์์ next ๋ฉ์๋๋ฅผ ํธ์ถํจ์ผ๋ก์ ์ด๋ค ๊ฐ์ด ์๋น๋๋ฉด, ์์ฑ์ ํจ์๋ yield ํค์๋๋ฅผ ๋ง๋ ๋๊น์ง ์คํ
//์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ธํ๊ธฐ ์ํด try catch ๋ฌธ์ผ๋ก ๊ฐ์
function* fn() {
try {
console.log(1);
yield 1;
console.log(2);
yield 2;
console.log(3);
console.log(4);
yield 3;
return "finish";
} catch (e) {
console.log(e);
}
}
const a = fn();
์ฌ์ฉ์ ์ ์ iterable
์ด์ ๊ฐ์ด ์์ ์ ๋ฐ๋ณต๊ฐ๋ฅ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค
์ด์ ๊ฐ์ด ์์ ์ ๋ฐ๋ณต๊ฐ๋ฅ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค
var myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
}
for (let value of myIterable) {
console.log(value);
}
// 1
// 2
// 3
or
[...myIterable]; // [1, 2, 3]โ
'Javascript > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฐ์คํฌ๋ฆฝํธ] ์๋ฃ๊ตฌ์กฐ ํ,์คํ, ํธ๋ฆฌ ๊ตฌํ (0) | 2022.04.25 |
---|---|
[์๋ฐ์คํฌ๋ฆฝํธ] web api ๋ถ๋ฌ์ค๊ธฐ (0) | 2022.04.24 |
[์๋ฐ์คํฌ๋ฆฝํธ] how to remove array element javascript (0) | 2022.04.17 |
generate random id ์ ๋ํ ๊นํ๋ธ ๋ต๋ณ (0) | 2022.04.17 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ๋ณต๋ฌธ (0) | 2022.04.14 |