์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ
ES6์์ ๋์ ๋ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ(iteration protocol)์ ๋ฐ์ดํฐ ์ปฌ๋ ์ ์ ์ํํ๊ธฐ ์ํ
ํ๋กํ ์ฝ(๋ฏธ๋ฆฌ ์ฝ์๋ ๊ท์น) ์ด๋ค. ์ด๊ฒ์ JS ์์ฒด์ ๋ ์์ ์ธ ํน์ง์ด๋ผ๊ธฐ๋ณด๋ค๋ ์ฌ๋ฌ ์ธ์ด์์ ๋ฐ๋ณต ๋์์ ์ํํ๊ธฐ ์ํด ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๊น๋ค.
ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค ๋ณด๋ฉด, ์ด๋ค ๊ตฌ์กฐ/๊ฐ์ฒด์ ๋ด๋ถ์์ ๋ฐ๋ณต ๋์์ ์ํํ๊ณ ์ถ์ ๋๊ฐ ์๋ค. ์ด๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด for..of๋ฌธ๊ณผ spread operator์ธ๋ฐ, ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํ ์ ์ ๊ฐ ๋ฐ๋ก Iteration Protocol์ด๋ค.
yield*์ destructuring assignment ๋ํ ์ด ๊ท์น์ ์์กดํ๋ ๊ตฌ๋ฌธ, ํํ์์ด๋ผ๊ณ ํ๋ค.
์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์๋ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ(iterable protocol)๊ณผ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ(iterator protocol)์ด ์๋ค.
์ด๋ ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ธํ๋ ์ชฝ(Data provider, [array, string, map/set, DOM data Structure..])๊ณผ ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ์ชฝ(Data consumerm, [for...of, spread, ... ])์ผ๋ก ๋๋์ด ๋ณด์.
์ฌ๊ธฐ์ ๋ง์ฝ ๋ฐ์ดํฐ ๊ณต๊ธ์ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๊ฐ๊ธฐ ๋ค๋ฅธ ์ํ ๋ฐฉ์์ ๊ฐ์ง๊ฒ ๋๋ค๋ฉด ๋ฐ์ดํฐ ์๋น์๋ ๊ทธ ๋ฐฉ์์ ์ผ์ผ์ด ๋์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์๋๋ก ์ง์ํด์ผ ํ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋ ํจ์จ์ ์ธ ๋ฐฉ์์ด ์๋๊ธฐ์ ํ๋์ ํต์ผ๋ ๊ท์น์ ๋ง๋ค์ด ๋ ์ฃผ์ฒด๊ฐ ์ด๊ฒ์๋ง ์์กดํ๊ฒ ํ ํ์๊ฐ ์๋ค. ๊ฒฐ๊ตญ, ์ด ๊ณผ์ ์์ ๋์ค๊ฒ ๋ ๊ฒ์ด Iteration Protocol์ด๋ฉฐ, ์ด๊ฒ์ ๋ฐ์ดํฐ ๊ณต๊ธ์์ ์๋น์ ์ฌ์ด๋ฅผ ์ด์ด์ฃผ๋ ์ธํฐํ์ด์ค(๋งค๊ฐ์ฒด)์ธ ์ ์ด๋ค.
์ดํฐ๋ฌ๋ธ์ ์ง์ํ๋ ๋ฐ์ดํฐ ์๋น์๋ ๋ด๋ถ์์ Symbol.iterator ๋ฉ์๋๋ฅผ ํธ์ถํด ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ดํฐ๋ ๋ฆฌํฐ์ next ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ดํฐ๋ฌ๋ธ์ ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ next ๋ฉ์๋๊ฐ ๋ฐํํ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด์ value ํ๋กํผํฐ ๊ฐ์ ์ทจ๋ํ๋ค.
JS์ Iteration Protocol์ ์ด๋ฃจ๋ ํ์ ๊ท์น์ Iterable Protocol๊ณผ Iterator Protocol์ด ์๋ค. ์ง๊ธ๋ถํฐ ๊ฐ Protocol์ ํน์ง์ ํจ๊ป ์์๋ณด์.
์ดํฐ๋ฌ๋ธ
์ดํฐ๋ฌ๋ธ์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ฒด์ ๋ฐ๋ณต์ ์ธ ๋์์ ๋ํ ์ ์์ด๋ค. ์ด๋ค ๊ฐ์ฒด์ ์๋์ 2๊ฐ์ง ์ฌํญ์ด ๊ตฌํ๋์ด ์๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ iterable์ด๋ค.
- ๊ฐ์ฒด๋ Symbol.iterator๋ผ๋ key๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
- Symbol.iterator์ value๋ iterator๋ฅผ ๋ฐํํ๋ ํจ์์ฌ์ผ ํ๋ค.
JS ๋ด์์ ํ์ธํ ์ ์๋ ๋ด์ฅํ ์ดํฐ๋ฌ๋ธ๊ฐ์ฒด ํ์ ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ด๋ค์ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ก ์ฒ๋ฆฌํด์ฃผ์ง ์์์ง๋ง
Symbol.iterator ๋ฉ์๋๋ฅผ ์์ ํ๊ณ ์๋ค.
- String
- Array
- Typed Array
- Map
- Set
- DOM data structure
- Arguments
์์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ํ์์ string ํ์ ์ ๋ณํ๊ณผ์ ์์ด ๋ฐ๋ณต๋ฌธ์ ํตํด ์ํ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
const string = "imstring"
for ( const i of string) {
console.log(i);
}
//
i
m
s
t
r
i
n
g
๋ํ, ์๋์ ๊ฐ์ด ์ผ๋ฐ ๊ฐ์ฒด๋ Symbol.iterator ๋ฉ์๋๋ฅผ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์.
์ผ๋ฐ ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ ์ดํฐ๋ฌ๋ธ์ด ์๋๋ฉฐ ์ดํฐ๋ฌ๋ธ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ํํ ์ ์๋ค.
const obj = { a: 1, b: 2 };
console.log(Symbol.iterator in obj); // false
// ์ดํฐ๋ฌ๋ธ์ด ์๋ ์ผ๋ฐ ๊ฐ์ฒด๋ for...of ๋ฌธ์์ ์ํํ ์ ์๋ค.
// TypeError: obj is not iterable
for (const p of obj) {
console.log(p);
}
ํ์ง๋ง, ์ด ๊ท์น์ ์ฌ์ฉ์ ์ ์๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ๋ด์ฅ ๊ฐ์ฒด๊ฐ ์๋๋๋ผ๋ ์ด๋ ๊ฐ์ฒด์์๋ ์ถฉ๋ถํ ๊ตฌํํ ์ ์๋ค. ์ด๋ ๋ค์์ ์์๋ณด๋๋ก ํ์.
(๐ธ : Symbol.iterator ๋ผ๋ key๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ํจ์๋ฅผ ์คํ์์ผ์ ๋์ค๋ ๊ฐ์ด ์ดํฐ๋ ์ดํฐ ์ธ๋ฐ ์ ํจ์๋ฅผ ๊ฐ์ ธ์์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํ๊ฐ์ผ๋ก ๋ง๋ค ์ ์๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธํ๋ค!!.)
์์ ๋ฐฐ์ด๊ณผ JS ๋ด์ฅํ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด ํ์ ์ ์ํ Symbol.iterator๋ผ๋ ์ผ์ข ์ Key๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ,
์ด Key๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ์ด ํจ์๋ผ๋ ๊ฒ์ ๋ณด์์ต๋๋ค.๊ทธ๋ฆฌ๊ณ ์ด ํจ์๋ฅผ ์คํ์์ผ์ ๋์ค๋ ๊ฐ์ด ๋ฐ๋ก ์ดํฐ๋ ์ดํฐ์ ๋๋ค.๊ทธ๋์ ๋ฐฐ์ด์ ์ดํฐ๋ฌ๋ธํ๋ค๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
- ์ด๋ฌํฐ๋ธ : ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ [Symbol.iterator]()๋ฅผ ๊ฐ์ง ๊ฐ
์ดํฐ๋ ์ดํฐ
Iterator Protocol์ ๊ฐ์ ์์๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ด๋ค. iterable๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ค ๊ฐ์ฒด์ ์๋์ 2๊ฐ์ง ์ฌํญ์ด ๊ตฌํ๋์ด ์๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ iterator์ด๋ค.
- ๊ฐ์ฒด๋ .next() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
- .next() ์คํ์ ๋ฐํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ key๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ฌ์ผ ํ๋ค.
- value - ๋ฐ๋ณต๋ฌธ ์์ ๋จ์ผ ๊ฐ์ด๋ฉฐ ์ด๋ ํ ํ์ ์ด๋ ์๊ด์๋ค.
- done - ๋ฐ๋ณต๋ฌธ ์ข ๊ฒฐ ์ฌ๋ถ์ ๋ํ ํ๋จ ๊ฐ์ด๋ฉฐ Boolean ํ์ ์ด๋ค.
์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ next ๋ฉ์๋๋ฅผ ์์ ํ๋ฉฐ next ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ฌ๋ธ์ ์ํํ๋ฉฐ value, done ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค. ์ด ๊ท์ฝ์ ์ค์ํ ๊ฐ์ฒด๊ฐ ์ดํฐ๋ ์ดํฐ์ด๋ค.
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ ์ดํฐ๋ฌ๋ธ์ Symbol.iterator ๋ฉ์๋๋ฅผ ์์ ํ๋ค. ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ค์ํ ์ดํฐ๋ ์ดํฐ๋ next ๋ฉ์๋๋ฅผ ๊ฐ๋๋ค.
์์ ๊ฐ์ด ์ดํฐ๋ ์ดํฐ์ next ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด value, done ํ๋กํผํฐ๋ฅผ ๊ฐ๋
์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ(iterator result) ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ดํฐ๋ ์ดํฐ์ next ๋ฉ์๋๋ ์ดํฐ๋ฌ๋ธ์ ๊ฐ ์์๋ฅผ ์ํํ๊ธฐ ์ํ ํฌ์ธํฐ์ ์ญํ ์ ํ๋ฉฐ.
next ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ฌ๋ธ์ ์์ฐจ์ ์ผ๋ก ํ ๋จ๊ณ์ฉ ์ํํ๋ฉฐ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ดํฐ๋ ์ดํฐ์ next ๋ฉ์๋๊ฐ ๋ฐํํ๋ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด์ value ํ๋กํผํฐ๋ ํ์ฌ ์ํ ์ค์ธ ์ดํฐ๋ฌ๋ธ์ ๊ฐ์ ๋ฐํํ๊ณ done ํ๋กํผํฐ๋ ์ดํฐ๋ฌ๋ธ์ ์ํ ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ค.
์ดํฐ๋ ์ดํฐ๋ ์ดํฐ๋ฌ๋ธํ๋ค
์์์์ฒ๋ผ ์ดํฐ๋ฌ๋ธํ ๊ฐ์์ ๊ฐ์ ธ์จ ์ดํฐ๋ ์ดํฐ๋ ๊ทธ ์์ฒด๋ก๋ ์ดํฐ๋ฌ๋ธํ๋ค๊ณ ๋ณผ ์ ์๋ค.
์ฆ, ์ดํฐ๋ ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ด Symbol.iterator๋ฅผ Key๋ก ํ๋ ์ดํฐ๋ ์ดํฐ ๋ฆฌํด ํจ์๋ฅผ ๊ฐ์ง๋ฉฐ.
์ด ๋ ๋ฐํ๋๋ ์ดํฐ๋ ์ดํฐ๋ ์๊ธฐ ์์ ์ด๋ค.
const arr = [1, 2, 3];
let arrIter = arr[Symbol.iterator]();
let iter = arrIter[Symbol.iterator](); // ์ดํฐ๋ ์ดํฐ๋ ์๊ธฐ ์์ ์ธ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
iter.next(); // { value : 1, done : false }
iter.next(); // { value : 2, done : false }
iter.next(); // { value : 3, done : false }
iter.next(); // { value : undefined, done : true }
์ดํฐ๋ฌ๋ธ/์ดํฐ๋ ์ดํฐ์ ์ด์
์ดํฐ๋ฌ๋ธํ๋ค๋ ๊ฒ์ ์์๋ค์ ์ฐจ๋ก๋ก ์ํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ดํฐ๋ฌ๋ธํ ๊ธฐ๋ณธ ์๋ฃ๊ตฌ์กฐ ๋ฟ๋ง ์๋๋ผ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์งํค๋ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ค์ for...of๋ฌธ์ผ๋ก ์ํํ๊ฑฐ๋ ์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ ์ ์๋ค๋ ์ด์ ์ด ์๊ธด๋ค.
const numbers = [1, 2, 3, 4, 5];
for (const number of numbers) { // ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ for...of ์ํ
console.log(number);
}
const [a, b, ...rest] = numbers; // ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ ๊ฐ ์ฐ์ฐ์
log(a); // 1
log(b); // 2
log(rest); // [3, 4, 5]
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ด๋ผ๋ ํ๋์ ๊ท์ฝ์ ํตํด ์ฌ์ฉ์์ ์๋์ ๋ฐ๋ผ ์๋กญ๊ฒ ์ ์ํ ์๋ฃ๊ตฌ์กฐ๋ ๊ฐ์ฒด๋ฅผ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๊ฒ ํ์ฌ ์ํ๊ฐ๋ฅํจ์ ๋ช ์ํ ์๋ ์๊ณ , ํ์์ ๋ฐ๋ผ ์ ๊ฐ ์ฐ์ฐ์ ๋ฑ์ ์ฌ์ฉํ์ฌ ๊น๋ํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์๋ค.
๐์ถ์ฒ/ ์ฐธ๊ณ
https://poiemaweb.com/es6-iteration-for-of
https://catsbi.oopy.io/79e5ee3a-7c93-4ed6-a48f-2da6eab42109
https://tecoble.techcourse.co.kr/post/2021-05-24-iteration-protocols/
'๐โ๐จFRONT-END > ๐งฉ JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ(๋ถ๋ณ์ฑ, ๊ฐ๋ณ์ฑ) (0) | 2023.02.11 |
---|---|
๋ณ์ ์ ์ธ๊ณผ ๋ฐ์ดํฐ ํ ๋น (0) | 2023.02.10 |
์๋ฐ์คํฌ๋ฆฝํธ async && await (2) | 2022.12.14 |
Event Loop (0) | 2022.12.12 |
RE:์ฝ๋ฐฑํจ์(Callback Function) ๋? (0) | 2022.11.17 |