๐ Weekly I Learned
๐ฆ What is the Iterator
- In JavaScript an iterator is an object which defines a sequence and potentially a return value upon its termination. by MDN
๐ Iterator interface
- next๋ผ๋ ํค๋ฅผ ๊ฐ๊ณ
- ๊ฐ์ผ๋ก ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ IteratorResultObject๋ฅผ ๋ฐํํ๋ ํจ์๊ฐ ์จ๋ค.
- IteratorResultObject๋ value์ done์ด๋ผ๋ ํค๋ฅผ ๊ฐ๊ณ ์๋ค.
- ์ด ์ค done์ ๊ณ์ ๋ฐ๋ณตํ ์ ์์์ง ์์์ง์ ๋ฐ๋ผ Boolean๊ฐ์ ๋ฐํํ๋ค.
์ 4๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด Iterator ๊ฐ์ฒด๋ผ๊ณ ๋ด
๋๋ค.
{
data:[1,2,3,4],
next() {
return {
done: this.data.length == 0,
value: this.data.pop()
};
}
}
๐ฆ Iterable Interface
- Symbol.iterator๋ผ๋ ํค๋ฅผ ๊ฐ๊ณ
- ์ด ํค๋ ๊ฐ์ผ๋ก ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ Iterator Object๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๊ฐ์ง๋๋ค.
{
arr: [1,2,3,4],
[Symbol.iterator](){return this;},
next() {
return {
done: this.arr.length == 0,
value: this.arr.pop()
};
}
};
๐ฟ Why use the Iterator?
- for๋ while๋ฌธ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ '๋ฌธ'์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋ฐ๋ณต์ด ๋๋๊ณ ๋๋ฉด ๋๋ฒ ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
- Iterator์ ๋ฐ๋ณต๋ฌธ์ '์'์ด๋ '๊ฐ'์ผ๋ก ๊ณ์ ์ ์ง ์์ผ์ฃผ๊ธฐ ์ํ ๋๊ตฌ(๋ฐ๋ณต ์ ์ฉ ๊ฐ์ฒด)
- ์ ์์ ์ ์ดํฐ๋ ์ดํฐ๋ ๋ฐ๋ณต ์์ฒด๋ฅผ ํ์ง๋ ์์ง๋ง ์ธ๋ถ์์ ๋ฐ๋ณต์ ํ๋ ค๊ณ ํ ๋ ๋ฐ๋ณต์ ํ์ํ ์กฐ๊ฑด๊ณผ ์คํ์ ๋ฏธ๋ฆฌ ์ค๋นํด ๋๊ณ ๊ทธ๊ฒ์ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ค.
- ์ฆ, ๋ฐ๋ณต ํ์์ ๋ฐ๋ณต์ ์ํ ์ค๋น๋ฅผ ๋ถ๋ฆฌํ์ฌ, ๋ฏธ๋ฆฌ ๋ฐ๋ณต์ ๋ํ ์ค๋น๋ฅผ ํด๋๊ณ ํ์ํ ๋ ํ์ํ ๋งํผ ๋ฐ๋ณต ์ํค๋ ๊ฒ์ ์ฌํํ ์ ์๋ค.
- ๋ฐ๋ณต ํ์๋ next() ํธ์ถ๋ก ์ด๋ฃจ์ด ์ง๋ค.
- ์ฌ์ฉ์ ๋ฐ๋ณต ์ฒ๋ฆฌ๊ธฐ Example
const loop = (iter, f) => {
//Iterable์ด๋ผ๋ฉด Iterator๋ฅผ ์ป์
if(typeof iter[Symbol.iterator] == 'function') {
iter = iter[Symbol.iterator]();
}else return;
//IteratorObject๊ฐ ์๋๋ผ๋ฉด ๊ฑด๋๋
if(typeof iter.next != 'function') return;
do {
const v = iter.next();
if(v.done) return; // ์ข
๋ฃ ์ฒ๋ฆฌ
f(v.value); // ํ์ฌ ๊ฐ์ ์ ๋ฌํจ. ๋ฐ๋ณต์ ๋ง๋ค ์ฒ๋ฆฌํด์ผํ๋ ํจ์ ํธ์ถ
}while(true) // ๋ฐ๋ณต๊ธฐ ์ ์ ์ด while๋ฌธ์ ๋ฌดํ๋ฃจํ๋ก ๊ทธ๋ฅ ๋ฐ๋ณต์ด๋ผ๋ ํ์๋ง ํ๋ค.
};
const iter = {
arr: [1,2,3,4],
[Symbol.iterator](){return this;},
next() {
return {
done: this.arr.length == 0,
value: this.arr.pop()
};
}
};
loop(iter, console.log);
// 4, 3, 2, 1
๐ Can use Es6+ operator When use the Iterator
- Array destructuring
- Spread operator
- Rest operator
- For ~ of
๐ฆ What is the Generator?
- The Generator object is returned by a generator function and it conforms to both the iterable protocol and the iterator protocol. by MDN
- ์ฝ๊ฒ ๋งํ์๋ฉด ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ฝ๋๊ฐ ๋๋ฌด ๋ง์ผ๋๊น ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
// Iterator
const N2 = class {
constructor(max) {
this.max = max;
}
[Symbol.interator](){
let cursor = 0, max=this.max;
return {
done: false,
next() {
if(cursor > max) {
this.done = true;
} else {
this.value = cursor * cursor;
cursor++;
}
return this;
}
};
}
};
// Generator
const generator = function* (max) {
let cursor = 0;
while(cursor < max) {
yield cursor * cursor;
cursor++;
}
};
๐ How to use Generator?
- function* (){} ์ธ Generator ์์ฑ ๋ฆฌํฐ๋ด์ ์ด์ฉํด์ ์์ฑํ๋ค.
- Generator๋ ์์ฑ ๋ฆฌํฐ๋ด์ ์ ์๋ ์ฝ๋๊ฐ ์คํ๋๋ฏ๋ก ์ง์ญ๋ณ์์ ์ธ์๋ฅผ ๊ฐ์ง๊ณ ์ผ๋ฐ์ ์ธ ์ ์ดํ๋ฆ์ ๋ฐ๋ฅธ๋ค.
- ํจ์์ ์ธ์์ ์ง์ญ๋ณ์๋ฅผ ์ฌ์ฉํด์ ์ ์ด๋ฌธ์ ์ฌ์ฉํ๊ณ ์๋ ์ผ๋ฐ์ ์ธ ๋๊ธฐํ ํ๋ฆ ํ๋ก์ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๊ณ ์๋ค. ์ ์ผํ๊ฒ ๋ค๋ฅธ๊ฑด yield๊ฐ ๋ฑ์ฅํ๊ณ ์๋ค.
- yield๋ฅผ ํธ์ถํ ๋๋ง๋ค Iterator์ next() ๊ฐ ๋ฐํ๋๋ ๊ฒ๊ณผ ๋๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
- Iterator์ ๋ค๋ฅธ ์ ์ yield๋ฅผ ๋ง๋๋ฉด ํจ์๊ฐ ๊ทธ ์๋ฆฌ์์ ๋ฉ์ถ๊ณ Iterator์ result๋ฅผ ๋ฐํํ๋ฉฐ, Generator ๊ฐ์ฒด๊ฐ next()๋ฅผ ํธ์ถํด์ผ ๋ค์ ๋ฉ์ถ ์ง์ ์์ ๋์ํ๋ค.
- Generator์์ yield๋ฅผ ๋ง๋๋ ๋์์ done: false๋ฅผ ์ ์งํ๋ฉฐ, Generator๋ฅผ ๋น ์ ธ๋๊ฐ ๋ done: true๊ฐ ๋๋ค.
๐ฆ ๋ง์น๋ฉฐ...
- ์ด ๊ธ์ ๋ชจ๋ ์์ ์ ๋ด์ฉ์ ์ฝ๋์คํผ์ธ youtube์ bsidesoft ์ฌ์ดํธ์ Generaotr ๊ธ์์ ํ์ธ ํ ์ ์์ต๋๋ค.
์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค :)