1. ์ดํฐ๋ฌ๋ธ(iterable)
์ดํฐ๋ ์ด์
์ JS์์๋ ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ(Iteration Protocol)์ด๋ผ ๋ถ๋ฆ
๋๋ค.
์ดํฐ๋ ์ด์ (iteration)๋ โ๋ฐ๋ณต, ์ํโ๋ผ๋ ๋ป์ ๋๋ค.ํ๋กํ ์ฝ์ โ๊ท๊ฒฉ, ์ฝ์, ์ธํฐํ์ด์คโ์ ๋์ผํ ๋ง์ ๋๋ค.
๊ทธ๋์ ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ โ์ํ๊ฐ ๊ฐ๋ฅํ๋คโ๋ผ๊ณ ๋ ๋งํ ์ ์์ต๋๋ค.
JS์์ ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฐ์ฒด๋ for...of, spread ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฆ, ์ด๋ค์ ์ํ๊ฐ ๊ฐ๋ฅํ ์ฐ์ฐ์์
๋๋ค.
์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ธฐ๋ณธ JS ์๋ฃ ๊ตฌ์กฐ๋ Array, String, Map, Set์ผ๋ก
์ด๋ค์ ๋ชจ๋ ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ for...of, spread ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ํ๋กํ ์ฝ(๊ท๊ฒฉ)์ ์ค์ํ๋ค๋ ๊ฒ์ ๋ฌด์จ ์๋ฏธ์ผ๊น์? ๊ท๊ฒฉ์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ ์ด๋ค ๊ฐ์ฒด๋ ์ง ์ํ๊ฐ ๊ฐ๋ฅํ๊ธฐ ์ํด์๋ ์ฒซ ๋ฒ์งธ๋ก๋ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ํ๋กํ ์ฝ ๋์ ์ ์ธํฐํ์ด์ค๋ผ๋ ๋ง์ ๋ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
์ํํ๊ณ ์ถ์ ์ํ๊ฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๊ฐ ๋๋ ค๋ฉด ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ฉด ๋๋๋ฐ,
๊ทธ ์ด๋ค ๊ฐ์ฒด ์์์๋ symbo.iterater๋ผ๋ ํจ์๋ฅผ ํธ์ถํ์ ๋, ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ง ํ๋ฉด,
์ ์ธํ ๊ฐ์ฒด๋ โ์ํ๊ฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ค. ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฐ์ฒด๋ค.โ๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
1{2[Symbol.iterator]() : iterator ํ๋กํ ์ฝ {3next(): ๋ค์๊ฐ4}5}
์ฆ, ์ํ๊ฐ ๊ฐ๋ฅํ ์ค๋ธ์ ํธ๊ฐ ๋๋ ค๋ฉด ๋ด ์ค๋ธ์ ํธ ์์ symbo.iterater๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ ,
๊ทธ ํจ์์์ ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ์ํํ๋ ๋ฐ๋ณต์๋ฅผ ๋ฆฌํดํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๋๋ค๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ๊ท๊ฒฉ ์ฌํญ๋ง ๋ฐ๋ฅด๋ฉด, for...of, spread ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
JavaScript์์ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๊ธฐ ์ํด์๋ ์ด 2๊ฐ์ง ํ๋กํ ์ฝ์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
- ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ผ์ผ ํ๋ค.
- ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ฅธ๋ค๋ ๋ง์
Symbol.iterator๋ฅผ ํธ์ถํ๋ฉด, ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํด์ผ ํจ
- ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ฅธ๋ค๋ ๋ง์
- ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ next๋ผ๋ ํจ์๊ฐ ์์ด์ ๋ค์ ๊ฐ์ ๊ณ์ ๋ฆฌํดํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
1.1 ์์ 1
1// Iterable ํ๋ค๋๊ฑด? ์ํ๊ฐ ๊ฐ๋ฅํ๋ค!2// [Symbol.iterator](): IterableIterator<T>;3// ์ฌ๋ณผ์ ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋, ํน์ ํ ํจ์๊ฐ IterableIterator<T>๋ฅผ ๋ฆฌํดํ๋ค๋ ๊ฒ์4// ์ํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ค! ๋ผ๋๊ฒ์ ์๋ฏธ5// ์ํ๊ฐ ๊ฐ๋ฅํ๋ฉด ๋ฌด์์ ํ ์ ์๋? for..of, spread ์ฐ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ6const array = [1, 2, 3];78// ๐ for...of ์ฐ์ฐ์ : ๋ฐฐ์ด ์์ ์๋ ์์ดํ ์ ์ํํ๋ฉด์ ๊ฐ์ ธ์ด9for (let item of array) {10console.log(item); // 1, 2, 311}1213// for...in : key๋ฅผ ์ถ๋ ฅ14const obj = { 0: 1, 1: 2 };15for (let item in obj) {16console.log(item); // obj์์ ์๋ key๋ฅผ ์ถ๋ ฅ
1.2 ์์ 2
1// Iterable ํ๋ค๋๊ฑด? ์ํ๊ฐ ๊ฐ๋ฅํ๋ค!2// [Symbol.iterator](): IterableIterator<T>;3// ์ฌ๋ณผ์ ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋, ํน์ ํ ํจ์๊ฐ IterableIterator<T>๋ฅผ ๋ฆฌํดํ๋ค๋ ๊ฒ์4// ์ํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ค! ๋ผ๋๊ฒ์ ์๋ฏธ5// ์ํ๊ฐ ๊ฐ๋ฅํ๋ฉด ๋ฌด์์ ํ ์ ์๋? for..of, spread ์ฐ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ6const array = [1, 2, 3]78// ๐ for...of ์ฐ์ฐ์ : ๋ฐฐ์ด ์์ ์๋ ์์ดํ ์ ์ํํ๋ฉด์ ๊ฐ์ ธ์ด9// ๐ array.entries() : [ํค, ๊ฐ] ํํ๋ก ์ถ๋ ฅ10for (const item of array.entries()) {11console.log(item)12/*13[ 0, 1 ]14[ 1, 2 ]15[ 2, 3 ]16*/17}1819// for...in : key๋ฅผ ์ถ๋ ฅ20const obj = { 0: 1, 1: 2 }21for (const item in obj) {22console.log(item) // obj์์ ์๋ key๋ฅผ ์ถ๋ ฅ -> 0, 123}2425const iterator = array.values()2627// done์ ๋ฐ๋ณต์ด ๋๋๋ฉด true, ์๋๋๋ฉด false28// console.log(iterator.next()); // { value: 1, done: false }29while (true) {30const item = iterator.next()31if (item.done) break32console.log(item.value)33}3435// console.log(iterator.next().value); // 136// console.log(iterator.next().value); // 237// console.log(iterator.next().value); // 338// console.log(iterator.next().done); // true3940// for (let item of iterator) {41// console.log(item); // 1, 2, 342// }
1.3 ์์ 3
1// [Symbol.iterator](): IterableIterator<T>;2// 0๋ถํฐ 10์ดํ๊น์ง ์ซ์์ 2๋ฐฐ๋ฅผ ์ํํ๋ ์ดํฐ๋ ์ดํฐ(๋ฐ๋ณต์) ๋ง๋ค๊ธฐ!3// 0, 1, 2, 3, ..., 94// 0, 2, 4, 6, ..., 1856const multiple = {7// [Symbol.iterator] ํจ์8[Symbol.iterator]: () => {9const max = 1010let num = 011// ์ค๋ธ์ ํธ๊ฐ ๋ฐํ๋จ12return {13// next ํจ์๊ฐ ๋ฐ๋์ ์์ด์ผ ํจ14next() {15// 10 ์ด๊ณผ๋๋ฉด done์ด true๊ฐ ๋์ด ์ํ์ด ์ ์ง16return { value: num++ * 2, done: num > max }17},18}19},20}2122console.clear()23for (const num of multiple) {24console.log(num)25}
2. ์ ๋๋ ์ดํฐ(Generator)
์ดํฐ๋ ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ฐ๊พผ ๊ฒ์ด ์ ๋๋ ์ดํฐ(Generator)์ ๋๋ค. Generator๋ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ์ค์ํ์ง๋ง, ์กฐ๊ธ ๋ ๊ฐํธํ ๋ฐฉ๋ฒ์ผ๋ก ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
1// ๐ ์ ๋๋ ์ดํฐ(์์ฑ๊ธฐ) : ๊ฐ์ ์์ฑ2// function๋ค์์ *๋ฅผ ๋ถ์ด๋ฉด ์ ๋๋ ์ดํฐ๋ก ์ธ์3function* multipleGenerator() {4try {5for (let i = 0; i < 10; i++) {6console.log(i) // 0๊น์ง๋ง ์ถ๋ ฅ7// return : ๋ฐ๋ก ๊ฐ์ ๋ฆฌํด8yield i ** 2 // yield : ์ฌ์ฉ์๊ฐ next๋ฅผ ํธ์ถํ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ํ๋์ฉ ๋ฆฌํด9// ์ฌ์ฉ์์๊ฒ ์ ์ด๊ถ์ ์๋ = yield10}11} catch (error) {12console.log(error)13}14}15const multiple = multipleGenerator()16let next = multiple.next()17console.log(next.value, next.done) // 0 false1819// multiple.return();20multiple.throw('Error!') // Error!2122next = multiple.next()23console.log(next.value, next.done) // undefined true