Generator
ํ์ ์คํฌ๋ฆฝํธ๋ Generator๊ฐ yield๋ฅผ ํตํด ๋ฐฉ์ถํ ๊ฐ์ ํ ๋๋ก ๋ฐ๋ณต์์ ํ์ ์ ์ถ๋ก ํ๋ค.
์ ๋๋ ์ดํฐ ํจ์
๋ฐ๋ณต์(iterator)์ ์ ๋๋ ์ดํฐ๋ ์์๊ด๊ณ๋ค.
์ ๋๋ ์ดํฐ๋ก ๊ฐ์ ์คํธ๋ฆผ์ ์์ฑํ ์ ์๊ณ ๋ฐ๋ณต์๋ก ์์ฑ๋ ๊ฐ์ ์๋นํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ดํฐ๋ฌ๋ธ(iterable;๋ฐ๋ณตํ ์ ์๋)Symbol.iterator ๋ผ๋ ํ๋กํผํฐ(๋ฐ๋ณต์๋ฅผ ๋ฐํํ๋ ํจ์)๋ฅผ ๊ฐ์ง ๋ชจ๋ ๊ฐ์ฒด
๋ฐ๋ณต์(iterator)next๋ผ๋ ๋ฉ์๋(value, done ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํ)๋ฅผ ์ ์ํ ๊ฐ์ฒด
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ฌ๋ธ ๋ฐ๋ณต์(IterableIterator)๊ฐ ๋ฐํ๋๋ค.
ํ์ ์คํฌ๋ฆฝํธ์์๋ ์ง์ํ๋ค.
//๋ค์ ํผ๋ณด๋์น ์ซ์๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด a์ b๋ฅผ, b์ a+b๋ฅผ ํ๋ฒ์ ๋ค์ ํ ๋นํ๋ค.
function* createFibonacciGenerator() {
let a = 0;
let b = 1;
while (true) {
yield a;
[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๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ค์ ํผ๋ณด๋์น ๊ฐ์ ๊ณ์ฐํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์ถํ๋ค. ํ์ ์คํฌ๋ฆฝํธ๋ Generator๊ฐ yield๋ฅผ ํตํด ๋ฐฉ์ถํ ๊ฐ์ ํ ๋๋ก ๋ฐ๋ณต์์ ํ์ ์ ์ถ๋ก ํ๋ค.
๋ค์ ์์ฒ๋ผ IterableIterator ์์ ๋ฐฉ์ถํ๋ ํ์ ์ ๊ฐ์ธ์ ์ ๋๋ ์ดํฐ ๋ฐํ ํ์ ์ ๋ช ์ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
์ง์ ๋ช ์ํ ์๋ ์๋ค.
function* createNumbers(): IterableIterator<number> {
let n = 0;
while( 1 ){
yield n++;
}
}
let numbers = creatNumbers();
numbers.next() // {value: 0, done: false}
numbers.next() // {value: 1, done: false}
numbers.next() // {value: 2, done: false}
๋ฐ๋ณต์(iterator)์ ์ ๋๋ ์ดํฐ(Generator๋ ํธ์ถ๋ ๋ Iterator๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ํน์ ํจ์)๋ ์์๊ด๊ณ๋ค.
์ ๋๋ ์ดํฐ๋ก ๊ฐ์ ์คํธ๋ฆผ์ ์์ฑํ ์ ์๊ณ ๋ฐ๋ณต์๋ก ์์ฑ๋ ๊ฐ์ ์๋นํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ดํฐ๋ฌ๋ธ(iterable;๋ฐ๋ณตํ ์ ์๋)
Symbol.iterator ๋ผ๋ ํ๋กํผํฐ(๋ฐ๋ณต์๋ฅผ ๋ฐํํ๋ ํจ์)๋ฅผ ๊ฐ์ง ๋ชจ๋ ๊ฐ์ฒด
- Symbol.Iterator ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด ์์ด์ผ ํ๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ Symbol.iterator ํค๋ฅผ ๊ฐ๋ ์์ฑ์ด ์์ด์ผ ํจ
- Symbol.Iterator ๋ Iterator์ ๋ฐํํด์ผ ํ๋ค
๋ฐ๋ณต์(iterator)
next๋ผ๋ ๋ฉ์๋(value, done ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํ)๋ฅผ ์ ์ํ ๊ฐ์ฒด
- next ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค
- next ๋ฉ์๋๋ value์ done ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ์์
์ด ๋๋๋ฉด done์ true๊ฐ ๋๋ค.
๊ฐ๋ น createFibonacciGenerator ํจ์๋ฅผ ํธ์ถํ๋ฉด Symbol.iterator ํ๋กํผํฐ์ next ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ ์ํ ๊ฐ์ ์ป๊ฒ ๋๋ค. ์ฆ, ์ดํฐ๋ฌ๋ธ๊ณผ ๋ฐ๋ณต์ ๋ ๊ฐ์ง๊ฐ ๊ฒฐํฉ๋ ์ ๋๋ ์ดํฐ๊ฐ ๋ฐํ๋๋ค.
Symbol.iterator์ next๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด(๋๋ ํด๋์ค)๋ฅผ ๋ง๋ค์ด ๋ฐ๋ณต์๋ ์ดํฐ๋ฌ๋ธ์ ์ง์ ์ ์ํ ์ ์๋ค. ๋ค์์ 1์์ 10๊น์ง์ ์ซ์๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐ๋ณต์๋ฅผ ์ ์ํ๋ ์๋ค.
let numbers = {
*[Symbol.iterator]() {
for (let n = 1; n <= 10; n++) {
yield n;
}
},
};
์ฌ์ฉ์ ์ ์ iterable
Symbol.iterator์ next๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด(๋๋ ํด๋์ค)๋ฅผ ๋ง๋ค์ด ๋ฐ๋ณต์๋ ์ดํฐ๋ฌ๋ธ์ ์ง์ ์ ์ํ ์ ์๋ค.
๋ค์์ 1์์ 10๊น์ง์ ์ซ์๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐ๋ณต์๋ฅผ ์ ์ํ๋ ์
์ด์ ๊ฐ์ด ์์ ์ ๋ฐ๋ณต๊ฐ๋ฅ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค
let numbers = {
*[Symbol.iterator]() {
for (let n = 1; n <= 10; n++) {
yield n;
}
},
};
console.log([...numbers]);
<์ถ๋ ฅ>
[
1, 2, 3, 4, 5,
6, 7, 8, 9, 10
]
//์ปค์คํ
๋ฐ๋ณต์
let numbers = {
*[Symbol.iterator](){
for(let n =1;n <= 10; n++){
yield n;
}
}
}
์ง์ ๋ช ์๋ ๊ฐ๋ฅ
let numbers = {
*[Symbol.iterator](): IterableIterator<number> {
for (let n = 1; n <= 10; n++) {
yield n;
}
},
};
for (let value of numbers) {
console.log(value);
}
<์ถ๋ ฅ>
1
2
3
4
5
6
7
8
9
10
<์ต์ข ์ ๊ฒ>
let numbers = {
*[Symbol.iterator](): IterableIterator<number> {
for (let n = 1; n <= 10; n++) {
yield n;
}
},
};
//for-of๋ก ๋ฐ๋ณต์ ๋ฐ๋ณตํ๊ธฐ
for (let a of numbers) {
console.log(a);
}
<์ถ๋ ฅ>
1
2
3
4
5
6
7
8
9
10
//๋ฐ๋ณต์ ์คํ๋ ๋
let allNumbers = [...numbers];
console.log(allNumbers);
<์ถ๋ ฅ>
[
1, 2, 3, 4, 5,
6, 7, 8, 9, 10
]
//๋ฐ๋ณต์ ๊ตฌ์กฐ ๋ถํด ํ ๋น(destructure)
let [one, two, ...rest] = numbers;
console.log(one);
console.log(two);
console.log(rest);
<์ถ๋ ฅ>
1
2
[
3, 4, 5, 6,
7, 8, 9, 10
]
'TypeScript > ํ์ ์คํฌ๋ฆฝํธ TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์ ์คํฌ๋ฆฝํธ] ๋ฌธ๋งฅ์ ํ์ ํ (0) | 2022.04.20 |
---|---|
[ํ์ ์คํฌ๋ฆฝํธ] ํธ์ถ ์๊ทธ๋์ฒ (0) | 2022.04.20 |
[ํ์ ์คํฌ๋ฆฝํธ] ์ปคํผ๋จธ์ ํด๋์ค๋ง๋ค๊ธฐ ์ค์ต (0) | 2022.04.19 |
[ํ์ ์คํฌ๋ฆฝํธ] ์ ๋๋ ์ดํฐ ์ง์, ๋ช ์ (0) | 2022.04.19 |
[ํ์ ์คํฌ๋ฆฝํธ] this ๊ด๋ จ ์ค๋ฅ (0) | 2022.04.19 |