์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ ์์ด ์คํธ๋ฆผ ํจ์ ์ผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ์ ํฉ๋๋ค. ์ค๊ฐ ๋ฐฐ์ด์ ์์ ๊ณ ์ง์ฐ ํ๊ฐ๋ฅผ ํตํด ์์ฒญ๋ ์ฑ๋ฅ ํฅ์์ ๊ฒฝํํ์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ์ ์๋ก์ด ๋์ฝ: ์ดํฐ๋ ์ดํฐ ํฌํผ ์คํธ๋ฆผ ํจ์ ์ฌ์ธต ๋ถ์
์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ธ๊ณ์์ ์ฑ๋ฅ์ ๋ํ ํ๊ตฌ๋ ๋์์๋ ์ฌ์ ์
๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ฐ์ดํฐ ์กฐ์์ ์ํ ์ผ๋ฐ์ ์ด๊ณ ์ฐ์ํ ํจํด์ .map(), .filter(), .reduce()์ ๊ฐ์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฒด์ด๋ํ๋ ๊ฒ์
๋๋ค. ์ด ์ ์ฐํ API๋ ๊ฐ๋
์ฑ์ด ์ข๊ณ ํํ๋ ฅ์ด ํ๋ถํ์ง๋ง, ์ค๊ฐ ๋ฐฐ์ด ์์ฑ์ด๋ผ๋ ์ค๋ํ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์จ๊ธฐ๊ณ ์์ต๋๋ค. ์ฒด์ธ์ ๊ฐ ๋จ๊ณ๋ง๋ค ์๋ก์ด ๋ฐฐ์ด์ด ์์ฑ๋์ด ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ดํด์ ์๋ชจํฉ๋๋ค. ๋์ฉ๋ ๋ฐ์ดํฐ์
์ ๊ฒฝ์ฐ ์ด๋ ์ฑ๋ฅ ์ฌ์์ด ๋ ์ ์์ต๋๋ค.
๋ฐ๋ก ์ด๋ TC39 ์ดํฐ๋ ์ดํฐ ํฌํผ(Iterator Helpers) ์ ์์ด ๋ฑ์ฅํฉ๋๋ค. ์ด๋ ECMAScript ํ์ค์ ํ๊ธฐ์ ์ผ๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ์ดํฐ ์ปฌ๋ ์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ฌ์ ์ํ ๊ฒ์ ๋๋ค. ๊ทธ ํต์ฌ์๋ ์คํธ๋ฆผ ํจ์ (๋๋ ์ฐ์ฐ ํจ์ )์ผ๋ก ์๋ ค์ง ๊ฐ๋ ฅํ ์ต์ ํ ๊ธฐ๋ฒ์ด ์์ต๋๋ค. ์ด ๊ธ์์๋ ์ด ์๋ก์ด ํจ๋ฌ๋ค์์ด ์ด๋ป๊ฒ ์๋ํ๊ณ , ์ ์ค์ํ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ๋ ํจ์จ์ ์ด๊ณ ๋ฉ๋ชจ๋ฆฌ ์นํ์ ์ด๋ฉฐ ๊ฐ๋ ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ์ด๋ป๊ฒ ๋์ธ ๊ฒ์ธ์ง ํฌ๊ด์ ์ผ๋ก ํ๊ตฌํฉ๋๋ค.
๊ธฐ์กด ์ฒด์ด๋์ ๋ฌธ์ ์ : ์ค๊ฐ ๋ฐฐ์ด ์ด์ผ๊ธฐ
์ดํฐ๋ ์ดํฐ ํฌํผ์ ํ์ ์ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด, ๋จผ์ ํ์ฌ์ ๋ฐฐ์ด ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ํ๊ณ๋ฅผ ์ดํดํด์ผ ํฉ๋๋ค. ์ซ์ ๋ชฉ๋ก์์ ์ฒ์ 5๊ฐ์ ์ง์๋ฅผ ์ฐพ์ ๋ ๋ฐฐ๋ก ๋ง๋ค๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์์งํ๋ ๊ฐ๋จํ ์ผ์์ ์ธ ์์ ์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์
ํ์ค ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ ๊น๋ํ๊ณ ์ง๊ด์ ์ ๋๋ค:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...]; // ์์ฃผ ํฐ ๋ฐฐ์ด์ด๋ผ๊ณ ์์ํด ๋ณด์ธ์
const result = numbers
.filter(n => n % 2 === 0) // 1๋จ๊ณ: ์ง์ ํํฐ๋ง
.map(n => n * 2) // 2๋จ๊ณ: ๋ ๋ฐฐ๋ก ๋ง๋ค๊ธฐ
.slice(0, 5); // 3๋จ๊ณ: ์ฒ์ 5๊ฐ ๊ฐ์ ธ์ค๊ธฐ
์ด ์ฝ๋๋ ์๋ฒฝํ๊ฒ ์ฝ๊ธฐ ์ฝ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง, ํนํ numbers ๋ฐฐ์ด์ ์๋ฐฑ๋ง ๊ฐ์ ์์๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋ฐ๋ณต 1 (
.filter()): ์์ง์numbers๋ฐฐ์ด ์ ์ฒด๋ฅผ ์ํํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์๋ก์ด ์ค๊ฐ ๋ฐฐ์ด(evenNumbers๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค)์ ์์ฑํ์ฌ ํ ์คํธ๋ฅผ ํต๊ณผํ ๋ชจ๋ ์ซ์๋ฅผ ๋ด์ต๋๋ค. ๋ง์ฝnumbers์ ๋ฐฑ๋ง ๊ฐ์ ์์๊ฐ ์๋ค๋ฉด, ์ด๋ ์ฝ 50๋ง ๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ด ๋ ์ ์์ต๋๋ค. - ๋ฐ๋ณต 2 (
.map()): ์ด์ ์์ง์evenNumbers๋ฐฐ์ด ์ ์ฒด๋ฅผ ์ํํฉ๋๋ค. ๋งคํ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ ๋ฒ์งธ ์ค๊ฐ ๋ฐฐ์ด(doubledNumbers๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค)์ ์์ฑํฉ๋๋ค. ์ด๊ฒ ๋ํ 50๋ง ๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ ๋ค๋ฅธ ๋ฐฐ์ด์ ๋๋ค. - ๋ฐ๋ณต 3 (
.slice()): ๋ง์ง๋ง์ผ๋ก, ์์ง์doubledNumbers์์ ์ฒ์ 5๊ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ ์ธ ๋ฒ์งธ ์ต์ข ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
์จ๊ฒจ์ง ๋น์ฉ
์ด ๊ณผ์ ์ ๋ช ๊ฐ์ง ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋๋ฌ๋ ๋๋ค:
- ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น: ์ฐ๋ฆฌ๋ ์ฆ์ ๋ฒ๋ ค์ง ๋ ๊ฐ์ ํฐ ์์ ๋ฐฐ์ด์ ๋ง๋ค์์ต๋๋ค. ๋งค์ฐ ํฐ ๋ฐ์ดํฐ์ ์ ๊ฒฝ์ฐ, ์ด๋ ์๋นํ ๋ฉ๋ชจ๋ฆฌ ์๋ฐ์ ์ ๋ฐํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ค์ง๊ฑฐ๋ ์ถฉ๋ํ ์๋ ์์ต๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ค๋ฒํค๋: ์์ ๊ฐ์ฒด๋ฅผ ๋ง์ด ์์ฑํ ์๋ก ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ด๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด ๋ ์ด์ฌํ ์ผํด์ผ ํ๋ฏ๋ก, ๋ฉ์ถค ํ์๊ณผ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๋ญ๋น๋๋ ์ฐ์ฐ: ์ฐ๋ฆฌ๋ ์๋ฐฑ๋ง ๊ฐ์ ์์๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ์ต๋๋ค. ๋ ๋์ ๊ฒ์, ์ฐ๋ฆฌ์ ์ต์ข
๋ชฉํ๋ ๋จ์ง ๋ค์ฏ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ฒ์ด์์ต๋๋ค. ํ์ง๋ง
.filter()์.map()๋ฉ์๋๋.slice()๊ฐ ๋๋ถ๋ถ์ ์์ ์ ๋ฒ๋ฆฌ๊ธฐ ์ ์ ์ ์ฒด ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌํ์ฌ ์๋ฐฑ๋ง ๊ฑด์ ๋ถํ์ํ ๊ณ์ฐ์ ์ํํ์ต๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ์ดํฐ๋ ์ดํฐ ํฌํผ์ ์คํธ๋ฆผ ํจ์ ์ด ํด๊ฒฐํ๊ณ ์ ํ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ ์๊ฐ: ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์๋ก์ด ํจ๋ฌ๋ค์
์ดํฐ๋ ์ดํฐ ํฌํผ ์ ์์ Iterator.prototype์ ์ง์ ์ต์ํ ๋ฉ์๋๋ค์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ ์ดํฐ๋ ์ดํฐ์ธ ๋ชจ๋ ๊ฐ์ฒด(์ ๋๋ ์ดํฐ ๋ฐ Array.prototype.values()์ ๊ฐ์ ๋ฉ์๋์ ๊ฒฐ๊ณผ ํฌํจ)๊ฐ ์ด๋ฌํ ๊ฐ๋ ฅํ ์ ๋๊ตฌ์ ์ ๊ทผํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ฃผ์ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
.map(mapperFn).filter(filterFn).take(limit).drop(limit).flatMap(mapperFn).reduce(reducerFn, initialValue).toArray().forEach(fn).some(fn).every(fn).find(fn)
์ด์ ์์ ๋ฅผ ์ด ์๋ก์ด ํฌํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...];
const result = numbers.values() // 1. ๋ฐฐ์ด์์ ์ดํฐ๋ ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
.filter(n => n % 2 === 0) // 2. ํํฐ ์ดํฐ๋ ์ดํฐ ์์ฑ
.map(n => n * 2) // 3. ๋งต ์ดํฐ๋ ์ดํฐ ์์ฑ
.take(5) // 4. ํ
์ดํฌ ์ดํฐ๋ ์ดํฐ ์์ฑ
.toArray(); // 5. ์ฒด์ธ ์คํ ๋ฐ ๊ฒฐ๊ณผ ์์ง
์ธ๋ป ๋ณด๊ธฐ์ ์ฝ๋๋ ๋๋๋๋ก ๋น์ทํฉ๋๋ค. ํต์ฌ์ ์ธ ์ฐจ์ด์ ์ ์์์ ์ธ numbers.values()๊ฐ ๋ฐฐ์ด ์์ฒด๊ฐ ์๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ๊ณผ, ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ดํฐ๋ ์ดํฐ๋ฅผ ์๋นํ๋ ์ข
๋ฃ ์ฐ์ฐ์ธ .toArray()์
๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ํ ๋ง๋ฒ์ ์ด ๋ ์ง์ ์ฌ์ด์์ ์ผ์ด๋๋ ์ผ์ ์์ต๋๋ค.
์ด ์ฒด์ธ์ ์ค๊ฐ ๋ฐฐ์ด์ ์ ํ ์์ฑํ์ง ์์ต๋๋ค. ๋์ , ์ด์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ฐ์ธ๋ ์๋กญ๊ณ ๋ ๋ณต์กํ ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๊ณ์ฐ์ ์ง์ฐ๋ฉ๋๋ค. .toArray()๋ .reduce()์ ๊ฐ์ ์ข
๋ฃ ๋ฉ์๋๊ฐ ๊ฐ์ ์๋นํ๊ธฐ ์ํด ํธ์ถ๋ ๋๊น์ง ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ์ด ์์น์ ์ง์ฐ ํ๊ฐ(lazy evaluation)๋ผ๊ณ ํฉ๋๋ค.
์คํธ๋ฆผ ํจ์ ์ ๋ง๋ฒ: ํ ๋ฒ์ ํ๋์ ์์ ์ฒ๋ฆฌํ๊ธฐ
์คํธ๋ฆผ ํจ์ ์ ์ง์ฐ ํ๊ฐ๋ฅผ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ๋ง๋๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ ์ฒด ์ปฌ๋ ์ ์ ๋ณ๋์ ๋จ๊ณ๋ก ์ฒ๋ฆฌํ๋ ๋์ , ๊ฐ ์์๋ฅผ ์ ์ฒด ์ฐ์ฐ ์ฒด์ธ์ ํตํด ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์กฐ๋ฆฝ ๋ผ์ธ ๋น์
์ ์กฐ ๊ณต์ฅ์ ์์ํด ๋ณด์ธ์. ์ ํต์ ์ธ ๋ฐฐ์ด ๋ฐฉ์์ ๊ฐ ๋จ๊ณ๋ฅผ ์ํ ๋ณ๋์ ๋ฐฉ์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค:
- 1๋ฒ ๋ฐฉ (ํํฐ๋ง): ๋ชจ๋ ์์์ฌ(์ ์ฒด ๋ฐฐ์ด)๊ฐ ๋ค์ด์ต๋๋ค. ์์ ์๋ค์ ๋ถ๋ํ์ ๊ฑธ๋ฌ๋ ๋๋ค. ์ํ์ ๋ชจ๋ ํฐ ํต(์ฒซ ๋ฒ์งธ ์ค๊ฐ ๋ฐฐ์ด)์ ๋ด๊น๋๋ค.
- 2๋ฒ ๋ฐฉ (๋งคํ): ์ํ์ด ๋ด๊ธด ํต ์ ์ฒด๊ฐ ๋ค์ ๋ฐฉ์ผ๋ก ์ฎ๊ฒจ์ง๋๋ค. ์ฌ๊ธฐ์ ์์ ์๋ค์ ๊ฐ ์์ดํ ์ ์์ ํฉ๋๋ค. ์์ ๋ ์์ดํ ์ ๋ ๋ค๋ฅธ ํฐ ํต(๋ ๋ฒ์งธ ์ค๊ฐ ๋ฐฐ์ด)์ ๋ด๊น๋๋ค.
- 3๋ฒ ๋ฐฉ (๊ฐ์ ธ์ค๊ธฐ): ๋ ๋ฒ์งธ ํต์ด ๋ง์ง๋ง ๋ฐฉ์ผ๋ก ์ฎ๊ฒจ์ง๋ฉด, ์์ ์๋ ๋จ์ํ ์์์๋ถํฐ ์ฒซ 5๊ฐ์ ์์ดํ ์ ๊บผ๋ด๊ณ ๋๋จธ์ง๋ ๋ฒ๋ฆฝ๋๋ค.
์ด ๊ณผ์ ์ ์ด์ก(๋ฉ๋ชจ๋ฆฌ ํ ๋น)๊ณผ ๋ ธ๋๋ ฅ(๊ณ์ฐ) ์ธก๋ฉด์์ ๋ญ๋น๊ฐ ์ฌํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ๋ก ๊ตฌ๋๋๋ ์คํธ๋ฆผ ํจ์ ์ ํ๋์ ์ธ ์กฐ๋ฆฝ ๋ผ์ธ๊ณผ ๊ฐ์ต๋๋ค:
- ํ๋์ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ๋ชจ๋ ์คํ ์ด์ ์ ํต๊ณผํฉ๋๋ค.
- ์์ดํ ์ด ๋ฒจํธ ์์ ๋์ ๋๋ค. ํํฐ๋ง ์คํ ์ด์ ์ผ๋ก ์ด๋ํฉ๋๋ค. ์คํจํ๋ฉด ์ ๊ฑฐ๋ฉ๋๋ค. ํต๊ณผํ๋ฉด ๊ณ์ ์งํํฉ๋๋ค.
- ์ฆ์ ๋งคํ ์คํ ์ด์ ์ผ๋ก ์ด๋ํ์ฌ ์์ ๋ฉ๋๋ค.
- ๊ทธ๋ฐ ๋ค์ ๊ณ์ ์คํ ์ด์ (take)์ผ๋ก ์ด๋ํฉ๋๋ค. ๊ฐ๋ ๊ด์ด ์๋ฅผ ์ ๋๋ค.
- ๊ฐ๋ ๊ด์ด ์ฑ๊ณต์ ์ธ ์์ดํ 5๊ฐ๋ฅผ ์ ๋๊น์ง ์ด ๊ณผ์ ์ด ํ ๋ฒ์ ํ๋์ฉ ๊ณ์๋ฉ๋๋ค. ๊ทธ ์์ ์์ ๊ฐ๋ ๊ด์ "๋ฉ์ถฐ!"๋ผ๊ณ ์ธ์น๊ณ ์ ์ฒด ์กฐ๋ฆฝ ๋ผ์ธ์ด ๋ฉ์ถฅ๋๋ค.
์ด ๋ชจ๋ธ์์๋ ์ค๊ฐ ์ ํ์ ๋ด๋ ํฐ ํต์ด ์์ผ๋ฉฐ, ์์ ์ด ์๋ฃ๋๋ ์๊ฐ ๋ผ์ธ์ด ๋ฉ์ถฅ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ดํฐ๋ ์ดํฐ ํฌํผ ์คํธ๋ฆผ ํจ์ ์ด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
๋จ๊ณ๋ณ ๋ถ์
์ดํฐ๋ ์ดํฐ ์์ numbers.values().filter(...).map(...).take(5).toArray()์ ์คํ์ ์ถ์ ํด ๋ด
์๋ค.
.toArray()๊ฐ ํธ์ถ๋ฉ๋๋ค. ๊ฐ์ด ํ์ํฉ๋๋ค. ์์ค์ธtake(5)์ดํฐ๋ ์ดํฐ์๊ฒ ์ฒซ ๋ฒ์งธ ์์ดํ ์ ์์ฒญํฉ๋๋ค.take(5)์ดํฐ๋ ์ดํฐ๋ ์ ์์ดํ ์ด ํ์ํฉ๋๋ค. ์์ค์ธmap์ดํฐ๋ ์ดํฐ์๊ฒ ์์ดํ ์ ์์ฒญํฉ๋๋ค.map์ดํฐ๋ ์ดํฐ๋ ๋ณํํ ์์ดํ ์ด ํ์ํฉ๋๋ค. ์์ค์ธfilter์ดํฐ๋ ์ดํฐ์๊ฒ ์์ดํ ์ ์์ฒญํฉ๋๋ค.filter์ดํฐ๋ ์ดํฐ๋ ํ ์คํธํ ์์ดํ ์ด ํ์ํฉ๋๋ค. ์์ค ๋ฐฐ์ด ์ดํฐ๋ ์ดํฐ์์ ์ฒซ ๋ฒ์งธ ๊ฐ์ธ1์ ๊ฐ์ ธ์ต๋๋ค.- '1'์ ์ฌ์ : ํํฐ๊ฐ
1 % 2 === 0์ ํ์ธํฉ๋๋ค. ์ด๋ false์ ๋๋ค. ํํฐ ์ดํฐ๋ ์ดํฐ๋1์ ๋ฒ๋ฆฌ๊ณ ์์ค์์ ๋ค์ ๊ฐ์ธ2๋ฅผ ๊ฐ์ ธ์ต๋๋ค. - '2'์ ์ฌ์ :
- ํํฐ๊ฐ
2 % 2 === 0์ ํ์ธํฉ๋๋ค. ์ด๋ true์ ๋๋ค.2๋ฅผmap์ดํฐ๋ ์ดํฐ๋ก ์ ๋ฌํฉ๋๋ค. map์ดํฐ๋ ์ดํฐ๋2๋ฅผ ๋ฐ์2 * 2๋ฅผ ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ์ธ4๋ฅผtake์ดํฐ๋ ์ดํฐ๋ก ์ ๋ฌํฉ๋๋ค.take์ดํฐ๋ ์ดํฐ๋4๋ฅผ ๋ฐ์ต๋๋ค. ๋ด๋ถ ์นด์ดํฐ(5์์ 4๋ก)๋ฅผ ๊ฐ์์ํค๊ณ4๋ฅผ.toArray()์๋น์์๊ฒ ๋ฐํ(yield)ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
- ํํฐ๊ฐ
.toArray()๋ ํ๋์ ๊ฐ์ ๊ฐ์ก์ต๋๋ค.take(5)์๊ฒ ๋ค์ ๊ฐ์ ์์ฒญํฉ๋๋ค. ์ ์ฒด ๊ณผ์ ์ด ๋ฐ๋ณต๋ฉ๋๋ค.- ํํฐ๋
3(์คํจ)์ ๊ฐ์ ธ์จ ๋ค์4(ํต๊ณผ)๋ฅผ ๊ฐ์ ธ์ต๋๋ค.4๋8๋ก ๋งคํ๋๊ณ , ์ด๋ ๊ฐ์ ธ์์ง๋๋ค. - ์ด ๊ณผ์ ์
take(5)๊ฐ 5๊ฐ์ ๊ฐ์ ๋ฐํํ ๋๊น์ง ๊ณ์๋ฉ๋๋ค. ๋ค์ฏ ๋ฒ์งธ ๊ฐ์ ์๋ ์ซ์10์์ ๋์ค๋ฉฐ, ์ด๋20์ผ๋ก ๋งคํ๋ฉ๋๋ค. take(5)์ดํฐ๋ ์ดํฐ๊ฐ ๋ค์ฏ ๋ฒ์งธ ๊ฐ์ ๋ฐํํ์๋ง์, ์์ ์ ์ญํ ์ด ๋๋ฌ์์ ์๋๋ค. ๋ค์์ ๊ฐ์ ์์ฒญ๋ฐ์ผ๋ฉด ์๋ฃ๋์์์ ์๋ฆฝ๋๋ค. ์ ์ฒด ์ฒด์ธ์ด ๋ฉ์ถฅ๋๋ค. ์ซ์11,12๋ฐ ์์ค ๋ฐฐ์ด์ ์๋ ์๋ฐฑ๋ง ๊ฐ์ ๋ค๋ฅธ ์ซ์๋ค์ ์์ ์ณ๋ค๋ณด์ง๋ ์์ต๋๋ค.
์ด์ ์ ์์ฒญ๋ฉ๋๋ค: ์ค๊ฐ ๋ฐฐ์ด์ด ์๊ณ , ์ต์ํ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๊ณ์ฐ์ด ์ค๋จ๋ฉ๋๋ค. ์ด๊ฒ์ ํจ์จ์ฑ ๋ฉด์์ ๊ธฐ๋ ๋น์ ์ธ ๋ณํ์ ๋๋ค.
์ค์ฉ์ ์ธ ์ ์ฉ ๋ฐ ์ฑ๋ฅ ํฅ์
์ดํฐ๋ ์ดํฐ ํฌํผ์ ํ์ ๋จ์ํ ๋ฐฐ์ด ์กฐ์์ ํจ์ฌ ๋ฐ์ด๋์ต๋๋ค. ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
์๋๋ฆฌ์ค 1: ๋์ฉ๋ ๋ฐ์ดํฐ์ ๋ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ
์ ๊ธฐ๊ฐ๋ฐ์ดํธ์ ๋ก๊ทธ ํ์ผ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋คํธ์ํฌ ์์ผ์์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์ ์ฒด ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์ด์ ๋ก๋ํ๋ ๊ฒ์ ์ข ์ข ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ(ํนํ ๋์ค์ ๋ค๋ฃฐ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
// ํฐ ํ์ผ์์ ์ค ๋จ์๋ก ๋ฐํํ๋ ์ ๋๋ ์ดํฐ์ ๊ฐ๋
์ ์์
function* readLines(filePath) {
// ์ ์ฒด ํ์ผ์ ๋ก๋ํ์ง ์๊ณ ํ ์ค์ฉ ์ฝ๋ ๊ตฌํ
// yield line;
}
const errorCount = readLines('huge_app.log').values()
.map(line => JSON.parse(line))
.filter(logEntry => logEntry.level === 'error')
.take(100) // ์ฒซ 100๊ฐ์ ์ค๋ฅ ์ฐพ๊ธฐ
.reduce((count) => count + 1, 0);
์ด ์์ ์์๋ ํ์ดํ๋ผ์ธ์ ํต๊ณผํ๋ ๋์ ํ์ผ์ ํ ์ค๋ง ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ์ต์ํ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ํ ๋ผ๋ฐ์ดํธ ๋จ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋๋ฆฌ์ค 2: ์กฐ๊ธฐ ์ข ๋ฃ ๋ฐ ๋จ๋ฝ ํ๊ฐ
์ด๋ฏธ .take()์์ ์ด๋ฅผ ๋ณด์์ง๋ง, .find(), .some(), .every()์ ๊ฐ์ ๋ฉ์๋์๋ ์ ์ฉ๋ฉ๋๋ค. ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๋ฆฌ์์ธ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์๋ฅผ ์ฐพ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ด
์๋ค.
๋ฐฐ์ด ๊ธฐ๋ฐ (๋นํจ์จ์ ):
const firstAdmin = users.filter(u => u.isAdmin)[0];
์ฌ๊ธฐ์ .filter()๋ ๋งจ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌ์์ผ์ง๋ผ๋ ์ ์ฒด users ๋ฐฐ์ด์ ์ํํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ ๊ธฐ๋ฐ (ํจ์จ์ ):
const firstAdmin = users.values().find(u => u.isAdmin);
.find() ํฌํผ๋ ๊ฐ ์ฌ์ฉ์๋ฅผ ํ๋์ฉ ํ
์คํธํ๊ณ ์ฒซ ๋ฒ์งธ ์ผ์น ํญ๋ชฉ์ ์ฐพ๋ ์ฆ์ ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ์ค๋จํฉ๋๋ค.
์๋๋ฆฌ์ค 3: ๋ฌดํ ์ํ์ค ์์
์ง์ฐ ํ๊ฐ๋ ์ ์ฌ์ ์ผ๋ก ๋ฌดํํ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์ด๋ ๋ฐฐ์ด๋ก๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ ๋๋ ์ดํฐ๋ ์ด๋ฌํ ์ํ์ค๋ฅผ ๋ง๋๋ ๋ฐ ์๋ฒฝํฉ๋๋ค.
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
// 1000๋ณด๋ค ํฐ ์ฒซ 10๊ฐ์ ํผ๋ณด๋์น ์ ์ฐพ๊ธฐ
const result = fibonacci()
.filter(n => n > 1000)
.take(10)
.toArray();
// result๋ [1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393]๊ฐ ๋ฉ๋๋ค
์ด ์ฝ๋๋ ์๋ฒฝํ๊ฒ ์คํ๋ฉ๋๋ค. fibonacci() ์ ๋๋ ์ดํฐ๋ ์์ํ ์คํ๋ ์ ์์ง๋ง, ์ฐ์ฐ์ด ์ง์ฐ๋๊ณ .take(10)์ด ์ค์ง ์กฐ๊ฑด์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ์์ฒญ์ ๋ง์กฑ์ํค๋ ๋ฐ ํ์ํ ๋งํผ๋ง ํผ๋ณด๋์น ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
๋ ๋์ ์ํ๊ณ ์ดํด๋ณด๊ธฐ: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ
์ด ์ ์์ ์๋ฆ๋ค์์ ๋๊ธฐ ์ดํฐ๋ ์ดํฐ์๋ง ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ๋ ์ ์
๋๋ค. ๋ํ AsyncIterator.prototype์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ(Async Iterators)๋ฅผ ์ํ ๋ณ๋ ฌ ํฌํผ ์ธํธ๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ด ์ด๋์๋ ์๋ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฒ์ ์ฒด์ธ์ ์
๋๋ค.
ํ์ด์ง๋ค์ด์
๋ API๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, Node.js์์ ํ์ผ ์คํธ๋ฆผ์ ์ฝ๊ฑฐ๋, ์น์์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์์ํด ๋ณด์ญ์์ค. ์ด๋ค์ ๋ชจ๋ ์์ฐ์ค๋ฝ๊ฒ ๋น๋๊ธฐ ์คํธ๋ฆผ์ผ๋ก ํํ๋ฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ผํ ์ ์ธ์ .map() ๋ฐ .filter() ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ํ์ด์ง๋ค์ด์
๋ API ์ฒ๋ฆฌ์ ๊ฐ๋
์ ์์
async function* fetchAllUsers() {
let url = '/api/users?page=1';
while (url) {
const response = await fetch(url);
const data = await response.json();
for (const user of data.users) {
yield user;
}
url = data.nextPageUrl;
}
}
// ํน์ ๊ตญ๊ฐ์ ํ์ฑ ์ฌ์ฉ์ ์ค ์ฒซ 5๋ช
์ฐพ๊ธฐ
const activeUsers = await fetchAllUsers()
.filter(user => user.isActive)
.filter(user => user.country === 'DE')
.take(5)
.toArray();
์ด๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ํตํฉํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๊ฐ๋จํ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐฐ์ด์ ์๋ , ์๊ฒฉ ์๋ฒ์ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์๋ , ๋์ผํ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ด๋ฉฐ ๊ฐ๋ ์ฑ ์ข์ ํจํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ํ๊ธฐ ๋ฐ ํ์ฌ ์ํ
2024๋ ์ด ํ์ฌ, ์ดํฐ๋ ์ดํฐ ํฌํผ ์ ์์ TC39 ํ๋ก์ธ์ค์ 3๋จ๊ณ(Stage 3)์ ์์ต๋๋ค. ์ด๋ ์ค๊ณ๊ฐ ์๋ฃ๋์์ผ๋ฉฐ ์์ํ๊ฐ ํฅํ ECMAScript ํ์ค์ ํฌํจ๋ ๊ฒ์ผ๋ก ์์ํ๋ค๋ ์๋ฏธ์ ๋๋ค. ํ์ฌ ์ฃผ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์์ ๊ตฌํ๊ณผ ๊ทธ ๊ตฌํ์ผ๋ก๋ถํฐ์ ํผ๋๋ฐฑ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
์ค๋ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ๋ธ๋ผ์ฐ์ ๋ฐ Node.js ๋ฐํ์: ์ฃผ์ ๋ธ๋ผ์ฐ์ (์: Chrome/V8) ๋ฐ Node.js์ ์ต์ ๋ฒ์ ์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์์ํ์ต๋๋ค. ํน์ ํ๋๊ทธ๋ฅผ ํ์ฑํํ๊ฑฐ๋ ๋งค์ฐ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ๋ค์ดํฐ๋ธ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. ํญ์ ์ต์ ํธํ์ฑ ํ(์: MDN ๋๋ caniuse.com)๋ฅผ ํ์ธํ์ธ์.
- ํด๋ฆฌํ(Polyfills): ์ด์ ๋ฐํ์์ ์ง์ํด์ผ ํ๋ ํ๋ก๋์
ํ๊ฒฝ์์๋ ํด๋ฆฌํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ Babel๊ณผ ๊ฐ์ ํธ๋์คํ์ผ๋ฌ์ ์ข
์ข
ํฌํจ๋๋
core-js๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. Babel๊ณผcore-js๋ฅผ ๊ตฌ์ฑํ๋ฉด ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ด์ ํ๊ฒฝ์์ ์๋ํ๋ ๋๋ฑํ ์ฝ๋๋ก ๋ณํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก : ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ฏธ๋
์ดํฐ๋ ์ดํฐ ํฌํผ ์ ์์ ๋จ์ํ ์๋ก์ด ๋ฉ์๋ ์ธํธ ๊ทธ ์ด์์ ๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ํํ๋ ฅ ์๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํฅํ ๊ทผ๋ณธ์ ์ธ ๋ณํ๋ฅผ ๋ํ๋ ๋๋ค. ์ง์ฐ ํ๊ฐ์ ์คํธ๋ฆผ ํจ์ ์ ์ฑํํจ์ผ๋ก์จ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฒด์ด๋ํ ๋ ๋ฐ์ํ๋ ์ค๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋ชจ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ํต์ฌ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ฑ๋ฅ: ์ดํฐ๋ ์ดํฐ ๋ฉ์๋ ์ฒด์ด๋์ ์ค๊ฐ ์ปฌ๋ ์ ์ ํผํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๋ถํ๋ฅผ ๋ํญ ์ค์ ๋๋ค.
- ์ง์ฐ์ฑ์ ํตํ ํฅ์๋ ์ ์ด: ๊ณ์ฐ์ ํ์ํ ๋๋ง ์ํ๋๋ฏ๋ก ์กฐ๊ธฐ ์ข ๋ฃ๊ฐ ๊ฐ๋ฅํ๊ณ ๋ฌดํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ํตํฉ๋ ๋ชจ๋ธ: ๋์ผํ ๊ฐ๋ ฅํ ํจํด์ด ๋๊ธฐ ๋ฐ ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ชจ๋์ ์ ์ฉ๋์ด ์ฝ๋๋ฅผ ๋จ์ํํ๊ณ ๋ณต์กํ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๊ฒ ํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด์ ํ์ค ์ผ๋ถ๊ฐ ๋จ์ ๋ฐ๋ผ ์๋ก์ด ์์ค์ ์ฑ๋ฅ์ ๋ฐํํ๊ณ ๊ฐ๋ฐ์๋ค์ด ๋ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ํ ๊ฒ์ ๋๋ค. ์ด์ ์คํธ๋ฆผ ๋ฐฉ์์ผ๋ก ์๊ฐํ๊ณ ๊ฒฝ๋ ฅ ์ต๊ณ ์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ ์ค๋น๋ฅผ ํ ๋์ ๋๋ค.