์ดํฐ๋ฌ๋ธ? ์ดํฐ๋ ์ดํฐ? ๊ทธ๋์ [Symbol.iterator] ๋ค์ด๋ณธ ์ ์ ์๋๊ฒ ์ด๊ฒ ๋ญ์ง? ์ถ์๋! ๋ฐ๋ก ๊ทธ ์ดํฐ๋ ์ดํฐ์ ๋ํด ๋ค๋ค๋ณด๊ณ ์ ํ๋ค.
1. ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ
Symbol.iterator
์ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ๊ฑฐ๋ ํ๋กํ ํ์
์ฒด์ธ์ ํตํด ์์๋ฐ์ Symbol.iterator ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ค์ํ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์ด ๊ท์ฝ์ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ด๋ผ๊ณ ํ๋ค.
2. ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ
์ดํฐ๋ฌ๋ธ์ Symbol.iterator ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํ
ํ๋ค. ์ดํฐ๋ ์ดํฐ๋ next
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ฌ๋ธ์ ์ํํ๋ฉฐ value์ done ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ์ดํฐ๋ ์ดํฐ ๋ฆฌ์ ํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ด ๊ท์ฝ์ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ด๋ผ๊ณ ํ๋ค.
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ ๊ฐ์ฒด๋ฅผ ์ดํฐ๋ฌ๋ธ์ด๋ผ๊ณ ํ๋ค. ์ฆ, Symbol.iterator๋ฅผ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ ๋ฉ์๋๋ฅด ์ง์ ๊ตฌํํ๊ฑฐ๋ ํ๋กํผํ์
์ฒด์ธ์ ํตํด ์์๋ฐ์ ๊ฐ์ฒด
๋ฅผ ๋งํ๋ค.
์ดํฐ๋ฌ๋ธ์ Symbol.interator ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ค์ํ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์ดํฐ๋ฌ๋ธ์ Symbol.iterator ๋ฉ์๋๊ฐ ๋ฐํํ ์ดํฐ๋ ์ดํฐ๋ next ๋ฉ์๋๋ฅผ ๊ฐ๋๋ค.
const arr = [1, 2];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // {value: 1, done: false }
console.log(iterator.next()); // {value: 2, done: false }
console.log(iterator.next()); // {value: undefined, done: true}
์ฌ์ฉ์ ์ ์ ์ดํฐ๋ฌ๋ธ
const iterable = {
// Symbol.iterator ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์
[Symbol.iterator]() {
let i = 3;
// Symbol.iterator ๋ฉ์๋์ next ๋ฉ์๋๋ฅผ ์์ ํ ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ์ดํฐ๋ ์ดํฐ์ธ ๊ฐ์ฒด๋ฅผ ๋ฐํ
return {
next() {
return i == 0 ? { done: true } : { value: i--, done: false }
},
[Symbol.iterator]() {
return this;
}
}
}
}
์ดํฐ๋ ์ดํฐ์ด์ ์ดํฐ๋ฌ๋ธ์ ์์ฑํ๋ ํจ์์ด๋ค. ์ ๋๋ ์ดํฐ๋ฅผ ๋ง๋๋ ค๋ฉด '์ ๋๋ ์ดํฐ ํจ์'๋ผ ๋ถ๋ฆฌ๋ function*
์ด ํ์ํ๋ค.
function* gen() {
yield 1;
yield 2;
yield 3;
}
let iter = gen();
log(iter[Symbol.iterator]() === iter); // true
์ฌ๊ธฐ์ ์ ๊น ๐๐ป
์ด์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ ๋ ๋ฑ์ ์ค์ ๋ก ๊ตฌํํ๋ ํด๋์ค๋ฅผ ๊ตฌํํ๋ ์ฝ๋๋ฅผ ๋ณด์๋ค.
๋ฑ ํด๋์ค ์ค ํ ๋ฉ์๋๊ฐ ์๋์ ๊ฐ์ด ์ ์๋์ด ์์๋ค.
class Node {
prev = null;
next = null;
constructor(value) {
this.value = value;
}
}
class Deque {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
.
.
.
*[Symbol.iterator]() {
let tmp = this.head;
while (tmp) {
yield tmp.value;
tmp = tmp.next;
}
}
}
console.log([...deque]);
๋ถ๋ช
์ด์ ๋ฌธ์ ๋ฅผ ํ ๋์๋ ์ ๊ฒ ๋ฌด์์ธ์ง ์ค๋ช
์ ๋ณด์๋ ์ดํด๊ฐ ๊ฐ์ง ์์์๋ค. ์ค๋ ๊ณต๋ถํ์ ๋ค์ ๋ณด๋ ์ดํด๊ฐ ๋์๋ค. ๋ฑ ์์ ์์๋ฅผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํ์๋๋ฐ ๊ทธ ๋ฆฌ์คํธ๋ฅผ ํธํ๊ฒ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๊ธฐ ์ํด์์๋ค.
์์ ๊ฐ์ด ์ฌ์ฉํ ์๋ ์๋ค๋ ๊ฒ์ด ์ ๊ธฐํ์๋ค.๐ฎ
์ค๋ ๋ฐฐ์ด ๋ด์ฉ ์ ๋ถ.. ์๋กญ๊ฒ ์๊ฒ๋ ๋ด์ฉ์ด๋ค. ๋จธ์ฑ ๐
์ดํฐ๋ฌ๋ธ๊ณผ ์ดํฐ๋ ์ดํฐ! ๊ทธ๋ฆฌ๊ณ ์ ๋๋ ์ดํฐ! ๋ค์ด๋ณธ ์ ๋ง ์์๋ ๊ฐ๋ ๋ค์ ์๋กญ๊ฒ ๋ฐฐ์ ๋ค. ์์งํ ์ฌ๋ฏธ์์๋ค. ์๋กญ๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐฐ์ด๋ค๋ ๊ฒ์ ์ฆ๊ฑฐ์ด ์ผ์ด๋ค!๐
์ฌ์ค ์์ ๋ด์ฉ ๋ง๊ณ ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์๋ ๋ฐฐ์ ๋ค.
์ง์ง ์ต์ํ์ง ์์ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ์ค ํฐ ์ ๋ง๋ค๊ธฐ
๋ผ๋ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ 3์๊ฐ์ด๋ ๊ฑธ๋ ธ๋ค. ์ต์ํ์ง ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ญ์ ๋ง์ด ํ์ด๋ณด๋ ๊ฒ ๋ง๊ณ ๋ ๋ต์ด ์๋ ๊ฒ ๊ฐ๋ค. ์ง๊ธ์ฒ๋ผ ๊พธ์คํ ํ์
๋ณต์ต!!
ํ์ง ์์ผ๋ฉด ์ค๋ ๋ฐฐ์ ๋ ๋ด์ฉ๋ ๊ณง ์ํ์งํ
๋ ์์ฃผ ํ์ด๋ณด์! ํ ๊ฒ์ด ๋ง์๋ ๋์น์ง ์๊ฒ ๋ฐ๋ณตํ๋ฉด์ ์ฑ๊ฒจ๋๊ฐ์!
์์ํ์ด ์ด๋ฒ์ฃผ๊น์ง๋ง ์งํ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๋๋ฌด๋๋ฌด ์์ฝ๋ค.๐ญ ๋๋ฌด ์งง์ ๊ฒ ์๋๊ฐใ
ใ
์ด์ ์ข ์๋ก ์ต์ํด์ง ๋ ์ฏค ๋ฐ๋๋ค๋!!
์๋ก์ด ๋ถ๋ค์ ์๋ ๊ฒ๋ ๋ฌผ๋ก ์ข์ง๋ง ์์ฌ์์ ์ด์ฉ ์ ์๋ ๊ฒ ๊ฐ๋ค!
ํ์ง๋ง ๊ด์ฐฎ์! ๋ค๋ฅธ ๊ณณ์์๋ ์ถฉ๋ถํ ๋ณผ ์ ์์ผ๋๊น!!๐ค
2์ฃผ์ฐจ์ ์ ์ด ๋ค์๊ณ ํ๋ฃจ๊ฐ ์ง๋ฌ๋ค. ๋จ์ ๊ธฐ๊ฐ์๋ ํํํ์ง ์๋๋ก ์ด์ฌํ ํ์
๋์ > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ ๋ค์ด๋ธ
์ฌ์ดํธ > ์ ๋๋ ์ดํฐ
์ค๋๋ ์ฑ์ฅ์ ์ฑ๊ณตํ์ จ๊ตฐ์... ใ ใ ์ ๋...๐