-
์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ฌ๋ธ๊ณผ ์ ๋๋ ์ดํฐ์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 13. 00:14
TLDR;
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ ๊ฐ์ฒด๋ฅผ ์ดํฐ๋ฌ๋ธ์ด๋ผ๊ณ ํ๋ค. ์ดํฐ๋ฌ๋ธ์ Symbol.iterator๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ฉ์๋ ์คํ์ nextํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋๋ฐ, nextํจ์ ์คํ์ value์ done์ ํ๋กํผํฐ๋ก ๊ฐ์ง๊ณ ์๋ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ดํฐ๋ฌ๋ธ์ for...of๋ฌธ, spread๋ฌธ๋ฒ, ๋์คํธ๋ญ์ณ๋ง ํ ๋น ๋ฑ์ด ๊ฐ๋ฅํ๋ค.
์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์ ์ดํฐ๋ฌ๋ธ์ ๊ตฌ๋ถํ ํ์๊ฐ ์๋๋ฐ, ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด๋ ์ธ๋ฑ์ค์ length๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ์ธ๋ฑ์ค๋ก ์ ๊ทผ๊ฐ๋ฅํ๊ณ , for ๋ฌธ์ด ์ฌ์ฉ๊ฐ๋ฅํ ๊ฐ์ฒด์ด๋ค. ์ดํฐ๋ฌ๋ธ์ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ค์ํ ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด๊ฐ ๋ฐ๋์ ์ดํฐ๋ฌ๋ธ์ ์๋๋ค.
์ ์ฌ๋ฐฐ์ด๊ณผ ์ดํฐ๋ฌ๋ธ์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ํ์ฉํ ์ ์๋๋ฐ, Array.from()์ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด๋ก ๋ณ๊ฒฝ๋์ด, ๋ฐฐ์ด์ ๋ด์ฅ ๋ฉ์๋๋ค์ด ์ฌ์ฉ๊ฐ๋ฅํด์ง๋ค.
1. ์ดํฐ๋ฌ๋ธ
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ
์ ์ค์ํ ๊ฐ์ฒด๋ฅผ ์ดํฐ๋ฌ๋ธ์ด๋ผ๊ณ ํ๋ค.
์ฆ, ์ดํฐ๋ฌ๋ธ์ Symbol.iterator๋ฅผ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ๊ฑฐ๋, ํ๋กํ ํ์ ์ฒด์ธ์ ํตํด ์์๋ฐ์ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.๊ทธ๋ ๋ค๋ฉด ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ด๋ ๋ฌด์์ผ๊น?
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ
- ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ : Symbol.iterator ( ) ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํธ์ถ ์
์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ
์ ์ค์ํ Iterator๋ฅผ ๋ฐํํ๋ ๊ท์ฝ - ์ดํฐ๋ ํฐ์ด ํ๋กํ ์ฝ : next ๋ฉ์๋๋ฅผ ์์ ํ๋ฉฐ, next ๋ฉ์๋ ํธ์ถ ์ ์ดํฐ๋ฌ๋ธ์ ์ํํ๋ฉฐ value์ done ํ๋กํผํฐ๋ฅผ ๊ฐ๋
์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด
๋ฅผ ๋ฐํํ๋ ๊ท์ฝ. ์ดํฐ๋ ์ดํฐ๋ ์ดํฐ๋ฌ๋ธ์ ์์๋ฅผ ํ์ํ๊ธฐ ์ํ ํฌ์ธํฐ ์ญํ ์ ํจ
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์๊ณ ๋ค์ ์ดํฐ๋ฌ๋ธ์ ๋ํด ์ดํดํด๋ณด์๋ฉด,
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฐ์ฒด๋ผ๋ ๊ฒ์
Symbol.iterator()
๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, Symbol.iterator ๋ฉ์๋ ํธ์ถ ์ Iterator๋ฅผ ๋ฐํํ๋๋ฐ, ์ด Iterator๋ next( ) ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, next ๋ฉ์๋ ํธ์ถ์ {value: , done: } ์ฒ๋ผ ์๊ธด ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.์ดํฐ๋ฌ๋ธ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด!!
1) ๊ฐ์ฒด ์์์ Symbol.iterator๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ
2) ๊ทธ ํจ์๊ฐ Iteratoํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ Iterator๋ฅผ ๋ฆฌํดํ๋๋ก ํ๋ฉด ๋๋๋ฐ,
3) Iterator ํ๋กํ ์ฝ์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ next ( ) ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ธ๋ฐ,
4) next( ) ํจ์๋ ๋ค์ { value: ๊ฐ , done : true/false}์ ๊ฐ์ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ฉด ๋๋ค.2. ์ดํฐ๋ฌ๋ธ์ ํน์ง๊ณผ ๋นํธ์ธ ์ดํฐ๋ฌ๋ธ
์ดํฐ๋ฌ๋ธ์ ํน์ง
์ดํฐ๋ฌ๋ธ์
for...of
๋ฌธ์ผ๋ก ์ํํ ์ ์์ผ๋ฉฐ,์คํ๋ ๋ ๋ฌธ๋ฒ
๊ณผ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น
์ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.const array = [1,2,3]; // ๋ฐฐ์ด์ Array.prototype์ Symbol.iterator ๋ฉ์๋๋ฅผ ์์๋ฐ๋ ์ดํฐ๋ฌ๋ธ์ด๋ค. console.log(Symbol.iterator in array); // true const iterator = array1.values(); for(const value of iterator){ console.log(value); } // ์ดํฐ๋ฌ๋ธ์ for...of ๋ฌธ์ผ๋ก ์ํ ๊ฐ๋ฅํ๋ค. for (const item of array) { console.log(item); }; // ์ดํฐ๋ฌ๋ธ์ธ ๋ฐฐ์ด์ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. console.log([...array]); // [1,2,3] // ์ดํฐ๋ฌ๋ธ์ธ ๋ฐฐ์ด์ ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น์ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. const [a, ...rest] = array; console.log(a, rest); [1, [2,3]] // * ๋น๊ต * // ์ดํฐ๋ฌ๋ธ์ด ์๋ ์ผ๋ฐ ๊ฐ์ฒด๋ for..of ์ฌ์ฉ ์๋๊ณ , for..in๋ง ์ฌ์ฉํ ์ ์๋ค. const obj = { 0: 1, 1: 2 }; for(const item in obj){ console.log(item); // key๋ฅผ ์ถ๋ ฅ }
๋นํธ์ธ ์ดํฐ๋ฌ๋ธ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ์ค์ํ ๊ฐ์ฒด์ธ ๋นํธ์ธ ์ดํฐ๋ฌ๋ธ์ ์ ๊ณตํ๋ค. ๋ค์ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ค์ ๋นํธ์ธ ์ดํฐ๋ฌ๋ธ์ด๋ค.
์ด ์ค, ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด์ ๊ฐ์ฅ ๊ด๋ฒ์ํ๊ฒ ์ฐ์ด๋ ๋ด์ฅ ์ดํฐ๋ฌ๋ธ์ด๋ค.
// ๋ฌธ์์ด ์์ for (let char of 'look'){ alert(char); // ๊ธ์ ํ๋๋น ํ ๋ฒ์ฉ, ์ด 4ํ ํธ์ถ๋๋ค. }
3. ์ดํฐ๋ฌ๋ธ๊ณผ for...of๋ฌธ ๋ฏ์ด๋ณด๊ธฐ
์ดํฐ๋ฌ๋ธ์ด ๋ฌด์์ ๋ฐํํ๋์ง ๋ฏ์ด๋ณด๊ธฐ
์ดํฐ๋ฌ๋ธ์ด ์ต์ข ์ ์ผ๋ก ๋ฌด์์ ๋ฐํํ๋์ง ์์๋ณด๊ธฐ ์ํด ์ดํฐ๋ ์ดํฐ์ nextํจ์๋ฅผ ์ง์ ์คํ์์ผ๋ณด์.
์ดํฐ๋ ์ดํฐ๋ฅผ ๊ฐ์ฒด์ ๋ด์ nextํจ์๋ฅผ ์คํ์ํฌ๋ ๋ง๋ค, value์ done์ด ์ถ๋ ฅ๋๊ณ , ์ ๋ถ ์ถ๋ ฅํ ํ์๋ value๋ 'undefined', done์ false๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
const arr = ['m', 'i', 'n', 'j', 'u']; const iterator = arr.values(); console.log(iterator); // Array Iterator { next() } console.log(iterator.next()); // {value: 'm', done: false} console.log(iterator.next()); // {value: 'i', done: false} console.log(iterator.next()); // {value: 'n', done: false} console.log(iterator.next()); // {value: 'j', done: false} console.log(iterator.next()); // {value: 'u', done: false} console.log(iterator.next()); // {value: undefined, done: false}
for ... of ๋ฌธ ๋ฏ์ด๋ณด๊ธฐ
for... or ๋ฌธ์ ๋ด๋ถ์ ์ผ๋ก ์ดํฐ๋ ์ดํฐ์ next ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ดํฐ๋ฌ๋ธ์ ์ํํ๋ฉฐ next ๋ฉ์๋๊ฐ ๋ฐํํ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด์ value ํ๋กํผํฐ ๊ฐ์ for... of ๋ฌธ์ ๋ณ์์ ํ ๋นํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด์ done ํ๋กํผํฐ ๊ฐ์ด false์ด๋ฉด ์ดํฐ๋ฌ๋ธ์ ์ํ๋ฅผ ๊ณ์ํ๊ณ , true์ด๋ฉด ์ดํฐ๋ฌ๋ธ์ ์ํ๋ฅผ ์ค๋จํ๋ค.
// ์ดํฐ๋ฌ๋ธ const array = [1, 2, 3]; for (const item of iterator) { console.log(item) } // ์์ for...of ๋ฌธ์ ์คํํ๋ฉด ๋ฒ์ด์ง๋ ์ผ const iterator = array.values(); // ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ฐ์ ธ์ while (true) { const item = iterator.next(); // next๋ฉ์๋๋ฅผ ์คํ์์ผ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด๋ฅผ ๋ณ์์ ๋ด๋๋ค. if(item.done) break; // ํ์ฌ์ ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด์ done์ด false ๋ฉด ๊ณ์ ์งํ console.log(item.value); // ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด์ ๊ฐ์ ์ฝ์์ ์ฐ๊ธฐ }
* ์ฐธ๊ณ . array.values( )๋ array iterator ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
4. ์ดํฐ๋ฌ๋ธ๊ณผ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด
์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด
- ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด๋?
- ์ธ๋ฑ์ค์ lengthํ๋กํผํฐ๊ฐ ์์ด์ ๋ฐฐ์ด์ฒ๋ผ ๋ณด์ด๋ ๊ฐ์ฒด
- ๋ง์น ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ก ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ ์ ์๊ณ
- length ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด ( ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ for๋ฌธ์ผ๋ก ์ํํ ์ ์๋ค.)
const arrayLike = { 0: 1, 1: 2, 2: 3, length: 3 }; // length ํ๋กํผํฐ๋ฅผ ๊ฐ๊ธฐ์ for๋ฌธ ์ํ๊ฐ ๊ฐ๋ฅํ๋ค. for (let i = 0; i < arrayLike.length; i++){ console.log(arrayLike[i]); // ๋ง์น ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ก ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ ์ ์๋ค. }
์, ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ๋ณด๋ฉด ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ์์ง ์์ง? (Symbol.iterator ( )๋ฅผ ๋ฉ์๋๋ก ๊ฐ์ง๊ณ ์์ง๋, ํ๋กํ ํ์ ์ ํตํด ์์๋ฐ์ง๋ ์์์ง?) ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ for...of ๋ฌธ์ผ๋ก ์ํํ ์ ์๋ค.
๋จ, arguments. NodeList, HTMLCollection์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๋ฉด์ ์ดํฐ๋ฌ๋ธ์ด๋ค. ์ ํํ ๋งํด, ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์ธ arguments, NodeList, HTMLCollection ๊ฐ์ฒด์ Symbol.iterator ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ์ดํฐ๋ฌ๋ธ์ด ๋์๋ค. ๋ฐ๋ผ์ ์๋ค๋ค์ ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด๋ก ์ฐ๋ฉด์ for...of ๋ฌธ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ดํฐ๋ฌ๋ธ๊ณผ ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ์ง์ง ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ฃผ๋ Array.from
Array.from์ ์ฌ์ฉํ๋ฉด ์ดํฐ๋ฌ๋ธ๊ณผ ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ์ง์ง ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ค ์ ์๋ค!
์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค๊ธฐ
const arrayLike = { 0: 1, 1: 2, 2: 3, length: 3 }; let realArray = Array.from(arrayLike); [1,2,3] realArray.pop(); // ๋ฐฐ์ด ๋ฉ์๋ ์ฌ์ฉ๊ฐ๋ฅ
์ดํฐ๋ฌ๋ธ์ ๋ฐฐ์ด๋ก ๋ง๋ค๊ธฐ
let range = { from: 1, to: 5, [Symbol.iterator]() { this.current = this.from; return this; }, next() { if (this.current <= this.to) { return { done: false, value: this.current++ }; } else { return { done: true }; } } }; console.log(Array.from(range)); // [1,2,3,4,5]
5. ๋๋ง์ ์ดํฐ๋ฌ๋ธ ๋ง๋ค์ด๋ณด๊ธฐ
0๋ถํฐ 10์ดํ ์ซ์๊น์ง ์ซ์ 2๋ฐฐ๋ฅผ ์ํํ๋ ์ดํฐ๋ฌ๋ธ ๋ง๋ค๊ธฐ
const multiple = { [Symbol.iterator]() { const max = 10; let num = 0; return { next() { return {value: num++ * 2, done: num > max} } } } } for(const num of multiple){ console.log(num); // 0, 2, 4, 6, 8 ..... 18 }
์ดํฐ๋ ์ด์ ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํจ์๋ก ๋ง๋ค๊ธฐ
function makeIterable(InitailValue, maxValue, callback){ return { [Symbol.iterator]() { const max = maxValue; let num = initialValue; return { next() { return {value: callback(num++), done: num > max} } } } } } const multiple = makeIterable(0, 20, (n) => n * 2); for(const num of multiple){ console.log(num) }
6. ์ดํฐ๋ฌ๋ธ์ ์ฌ์ฉ
๋ฐฐ์ด์ด๋ ๋ฌธ์์ด ๋ฑ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฏธ๋ฆฌ ํ๋ณดํ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ธํ๋ค. ํ์ง๋ง ์ดํฐ๋ฌ๋ธ์ ๊ฒฝ์ฐ for...of ๋ฌธ์ด๋ ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น ๋ฑ์ด ์คํ๋๊ธฐ ์ด์ ๊น์ง๋ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋์ง ์๋ค๊ฐ, next()๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋
์ง์ฐ ํ๊ฐ(lazy evaluation)
์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.์ง์ฐ ํ๊ฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ์ง ์๊ณ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์๊ฐ์ ์์ฑํ๋ฏ๋ก,
- ๋น ๋ฅธ ์คํ ์๋๋ฅผ ๊ธฐ๋ํ ์ ์๊ณ
- ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ์ง ์์ผ๋ฉฐ ๋ฌดํ๋ ํํํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
7. ์ ๋๋ ์ดํฐ
์ดํฐ๋ฌ๋ธ์ ์ฌ์ฉํ ๋ ๋ณดํต for...of ๋ฌธ์ ์ฌ์ฉํ๋๋ฐ, ๊ทธ๋ฌ๋ฉด ๋ฐ๋ณตํด์ ์ผ์ด ์ญ ์ํ๋๊ณ ์ง์ ๊ทธ ๋ฐ๋ณต์ด ๋์๊ฐ๋ ๊ฒ์ ๋ฉ์ถ ์ ์๋ค. ์ ๋๋ ์ดํฐ๋ ์ฝ๋ ๋ธ๋ก์ ์คํ์ ์ผ์ ์ค์งํ๋ค๊ฐ ํ์ํ ์์ ์ ์ฌ๊ฐํ ์ ์๋ ํน์ํ ํจ์๋ค.
์ผ๋ฐ ํจ์์์ ์ฐจ์ด์
- ์ ๋๋ ์ดํฐ ํจ์๋ ํจ์ ํธ์ถ์์๊ฒ ํจ์ ์คํ์ ์ ์ด๊ถ์ ์๋ํ ์ ์๋ค.
- ์ ๋๋ ์ดํฐ ํจ์๋ ํจ์ ํธ์ถ์์ ํจ์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
- ์ ๋๋ ์ดํฐ ํจ์ ํธ์ถ ์ ์ฝ๋ ์คํ์ด ์๋๋ผ ์ ๋๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ ๋๋ ์ดํฐ ํจ์ ์ฌ์ฉ๋ฒ
1. ์์ฑ
function*
ํค์๋๋ก ์์ฑํ๋ฉฐ,- ํ๋ ์ด์์ yield ํํ์์ ํฌํจํ๋ค.
- ์ฃผ์ํ ์ : ํ์ดํ ํจ์๋ก ์ ์ ์ด๋ ต๊ณ , new ์์ฑ์ ํจ์๋ก ํธ์ถํ ์ ์๋ค.
2. ์ฌ์ฉ
- ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ์คํ์ํค๋ฉด ์ ๋๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉฐ
- ์ ๋๋ ์ดํฐ ๊ฐ์ฒด์ next ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด yield ๊ตฌ๋ฌธ ํ๋์ฉ ์คํ๋๋ค.
์ ๋๋ ์ดํฐ ๊ฐ์ฒด
์๋ ์ผ๋ฐ ์ดํฐ๋ ์ดํฐ์๋ ์๋return
๊ณผthrow
๋ฉ์๋๊ฐ ์๋ค
function* genFunc(){ yield 1; yield 2; yield 3; } const generator = gneFunc(); console.log(generator.next()); // {value: 1, done: false} console.log(generator.return(30)); // {value: 30, done: true} // value์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ฃ๊ณ , ๋ฐ๋ก ๋ชจ๋ ์ ๋๋ ์ดํฐ๋ฅผ ์คํ ์๋ฃ์์ผ๋ฒ๋ฆฐ๋ค. console.log(generator.throw('Error!')); // ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ , value์ undefined๋ฅผ, done์ true๋ฅผ ๊ฐ๋ ์ด๋ฌํ ๋ฆฌ์ด ๋ฆฌ์ ํธ ๊ฐ์ฒด๋ฅผ ๋ฐํ
8. ์ ๋๋ ์ดํฐ์ ํ์ฉ
์ดํฐ๋ฌ๋ธ ๊ตฌํ
์ ๋๋ ์ดํฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ดํฐ๋ฌ๋ธ์ ํจ์ฌ ๊ฐ๋จํ ๊ตฌํํ ์ ์๋ค.
// ๊ธฐ์กด์ ์ดํฐ๋ฌ๋ธ const multiple = { [Symbol.iterator]() { const max = 10; let num = 0; return { next() { return {value: num++ * 2, done: num > max} } } } } // ์ ๋๋ ์ดํฐ๋ฅผ ํตํ์ฌ ๊ตฌํํ ์ดํฐ๋ฌ๋ธ - ์ง์ง ๊ฐ๋จ!!! function* multipleGenerator(){ for(let i = 0; i<10; i++){ yield i ** 2; } }
์ ๋๋ ์ดํฐ ์,๋ฐ์ผ๋ก ์ ๋ณด ๊ตํ
function* gen(){ let ask1 = yield "2 + 2 = ?"; alert(ask1); let ask2 = yield "3 * 3 = ?"; alert(ask2); } let generator = gen(); alert(generator.next().value); // "2 + 2 = ?", ์์ง ask์๋ ๊ฐ์ด ๋ด๊ธฐ์ง ์์ alert(generator.next(4).value); // 1) ๋จผ์ ask1์ ๊ฐ ํ ๋น, 2) value ์ถ๋ ฅ "3 * 3 = ?" alert(generator.next(9).done); // 1) ๋จผ์ ask2์ ๊ฐ ํ ๋น, 2) done ์ถ๋ ฅ true
ํ์ฉ์์
์์ฌ ๋์ ์์ฑ๊ธฐ ๋ง๋ค๊ธฐ :
๊ณ ์ ๊ฐ
์ ๋ฐ์ ์๋ ๊ณต์์ ์ฌ์ฉํด ์ ๋๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ด๋ ํจ์์ธ pseudoRandom(seed)function* pseudoRandom(seed) { let value = seed; while(true) { value = value * 16807 % 2147483647 yield value; } }; let generator = pseudoRandom(1); console.log(generator.next().value) // 16807 console.log(generator.next().value) // 282475249 console.log(generator.next().value) // 1622650073
์ฐธ๊ณ
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ 34์ฅ ์ดํฐ๋ฌ๋ธ
- https://ko.javascript.info/iterable
- https://poiemaweb.com/es6-iteration-for-of
- https://ko.javascript.info/generators
- ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ : Symbol.iterator ( ) ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํธ์ถ ์