ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ
    ์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ 2023. 2. 13. 00:14

    TLDR;

    ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ดํ„ฐ๋Ÿฌ๋ธ”์€ Symbol.iterator๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฉ”์„œ๋“œ ์‹คํ–‰์‹œ nextํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, nextํ•จ์ˆ˜ ์‹คํ–‰์‹œ value์™€ done์„ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ์ดํ„ฐ๋Ÿฌ๋ธ”์€ for...of๋ฌธ, spread๋ฌธ๋ฒ•, ๋””์ŠคํŠธ๋Ÿญ์ณ๋ง ํ• ๋‹น ๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์™€ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๋ฐ, ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๋Š” ์ธ๋ฑ์Šค์™€ length๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ณ , for ๋ฌธ์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ด๋‹ค. ์ดํ„ฐ๋Ÿฌ๋ธ”์€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด์ด๋‹ค. ๋”ฐ๋ผ์„œ ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ดํ„ฐ๋Ÿฌ๋ธ”์€ ์•„๋‹ˆ๋‹ค.

    ์œ ์‚ฌ๋ฐฐ์—ด๊ณผ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Array.from()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝ๋˜์–ด, ๋ฐฐ์—ด์˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋“ค์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

    1. ์ดํ„ฐ๋Ÿฌ๋ธ”

    ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ผ๊ณ  ํ•œ๋‹ค.
    ์ฆ‰, ์ดํ„ฐ๋Ÿฌ๋ธ”์€ Symbol.iterator๋ฅผ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

    ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ

    • ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ : Symbol.iterator ( ) ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํ˜ธ์ถœ ์‹œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ Iterator๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ทœ์•ฝ
    • ์ดํ„ฐ๋ ˆํ‹ฐ์–ด ํ”„๋กœํ† ์ฝœ : next ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•˜๋ฉฐ, next ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ˆœํšŒํ•˜๋ฉฐ value์™€ done ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ทœ์•ฝ. ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ํฌ์ธํ„ฐ ์—ญํ• ์„ ํ•จ

    ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์•Œ๊ณ  ๋‹ค์‹œ ์ดํ„ฐ๋Ÿฌ๋ธ”์— ๋Œ€ํ•ด ์ดํ•ดํ•ด๋ณด์ž๋ฉด,

    ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์€ Symbol.iterator()๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, Symbol.iterator ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ Iterator๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ด Iterator๋Š” next( ) ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, next ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ {value: , done: } ์ฒ˜๋Ÿผ ์ƒ๊ธด ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด!!

    1) ๊ฐ์ฒด ์•ˆ์—์„œ Symbol.iterator๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ 
    2) ๊ทธ ํ•จ์ˆ˜๊ฐ€ Iteratoํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๋Š” Iterator๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ํ•˜๋ฉด ๋˜๋Š”๋ฐ,
    3) Iterator ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅธ๋‹ค๋Š” ๊ฒƒ์€ next ( ) ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ธ๋ฐ,
    4) next( ) ํ•จ์ˆ˜๋Š” ๋‹ค์‹œ { value: ๊ฐ’ , done : true/false}์™€ ๊ฐ™์€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค.

     

    2. ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ํŠน์ง•๊ณผ ๋นŒํŠธ์ธ ์ดํ„ฐ๋Ÿฌ๋ธ”

    ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ํŠน์ง•

    ์ดํ„ฐ๋Ÿฌ๋ธ”์€ for...of๋ฌธ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•๊ณผ ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น์˜ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    const array = [1,2,3];
    
    // ๋ฐฐ์—ด์€ Array.prototype์˜ Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค.
    console.log(Symbol.iterator in array); // true
    
    const iterator = array1.values();
    for(const value of iterator){
        console.log(value);
    }
    
    // ์ดํ„ฐ๋Ÿฌ๋ธ”์€ for...of ๋ฌธ์œผ๋กœ ์ˆœํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    for (const item of array) {
        console.log(item);
    };
    
    // ์ดํ„ฐ๋Ÿฌ๋ธ”์ธ ๋ฐฐ์—ด์€ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์˜ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log([...array]);  // [1,2,3]
    
    // ์ดํ„ฐ๋Ÿฌ๋ธ”์ธ ๋ฐฐ์—ด์€ ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น์˜ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    const [a, ...rest] = array;
    console.log(a, rest); [1, [2,3]]
    
    // * ๋น„๊ต *
    // ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ์•„๋‹Œ ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” for..of ์‚ฌ์šฉ ์•ˆ๋˜๊ณ , for..in๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    const obj = { 0: 1, 1: 2 };
    for(const item in obj){
        console.log(item);   // key๋ฅผ ์ถœ๋ ฅ
    }

    ๋นŒํŠธ์ธ ์ดํ„ฐ๋Ÿฌ๋ธ”

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด์ธ ๋นŒํŠธ์ธ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์Œ ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด๋“ค์€ ๋นŒํŠธ์ธ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค.

    ์ด ์ค‘, ๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด์€ ๊ฐ€์žฅ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๋‚ด์žฅ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค.

    // ๋ฌธ์ž์—ด ์˜ˆ์‹œ
    for (let char of 'look'){
        alert(char); // ๊ธ€์ž ํ•˜๋‚˜๋‹น ํ•œ ๋ฒˆ์”ฉ, ์ด 4ํšŒ ํ˜ธ์ถœ๋œ๋‹ค.
    }

     

    3. ์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ for...of๋ฌธ ๋œฏ์–ด๋ณด๊ธฐ

    ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ๋œฏ์–ด๋ณด๊ธฐ

    ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ์ตœ์ข…์ ์œผ๋กœ ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ nextํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์‹คํ–‰์‹œ์ผœ๋ณด์ž.

    ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์— ๋‹ด์•„ nextํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ๋•Œ ๋งˆ๋‹ค, value์™€ done์ด ์ถœ๋ ฅ๋˜๊ณ , ์ „๋ถ€ ์ถœ๋ ฅํ•œ ํ›„์—๋Š” value๋Š” 'undefined', done์€ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    const arr = ['m', 'i', 'n', 'j', 'u'];
    
    const iterator = arr.values(); 
    console.log(iterator);           // Array Iterator { next() }
    
    console.log(iterator.next());    // {value: 'm', done: false}
    console.log(iterator.next());    // {value: 'i', done: false}
    console.log(iterator.next());    // {value: 'n', done: false}
    console.log(iterator.next());    // {value: 'j', done: false}
    console.log(iterator.next());    // {value: 'u', done: false}
    console.log(iterator.next());    // {value: undefined, done: false}

    for ... of ๋ฌธ ๋œฏ์–ด๋ณด๊ธฐ

    for... or ๋ฌธ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ next ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ˆœํšŒํ•˜๋ฉฐ next ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ ๊ฐ์ฒด์˜ value ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ for... of ๋ฌธ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ ๊ฐ์ฒด์˜ done ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด false์ด๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์ˆœํšŒ๋ฅผ ๊ณ„์†ํ•˜๊ณ , true์ด๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์ˆœํšŒ๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.

    // ์ดํ„ฐ๋Ÿฌ๋ธ”
    const array = [1, 2, 3];
    
    for (const item of iterator) {
        console.log(item)
    }
    
    // ์œ„์˜ for...of ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฒŒ์–ด์ง€๋Š” ์ผ
    const iterator = array.values();    // ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€
    while (true) {                      
        const item = iterator.next();   // next๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ ๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค.
        if(item.done) break;       // ํ˜„์žฌ์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ done์ด false ๋ฉด ๊ณ„์† ์ง„ํ–‰          
        console.log(item.value);   // ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ฝ˜์†”์— ์ฐ๊ธฐ
    }

    * ์ฐธ๊ณ . array.values( )๋Š” array iterator ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    4. ์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด

    ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด

    • ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๋ž€?
      • ์ธ๋ฑ์Šค์™€ lengthํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์–ด์„œ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฐ์ฒด
      • ๋งˆ์น˜ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ 
      • length ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด ( ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.)
    const arrayLike = {
        0: 1,
        1: 2,
        2: 3,
        length: 3
    };
    
    // length ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๊ธฐ์— for๋ฌธ ์ˆœํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    for (let i = 0; i < arrayLike.length; i++){
        console.log(arrayLike[i]); // ๋งˆ์น˜ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    }

    ์ž, ์œ ์‚ฌ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ๋ณด๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์€ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ์ง€ ์•Š์ง€? (Symbol.iterator ( )๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋„, ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•ด ์ƒ์†๋ฐ›์ง€๋„ ์•Š์•˜์ง€?) ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด๋Š” for...of ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์—†๋‹ค.

    ๋‹จ, arguments. NodeList, HTMLCollection์€ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค. ์ •ํ™•ํžˆ ๋งํ•ด, ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์ธ arguments, NodeList, HTMLCollection ๊ฐ์ฒด์— Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–˜๋„ค๋“ค์€ ์œ ์‚ฌ๋ฐฐ์—ด ๊ฐ์ฒด๋กœ ์“ฐ๋ฉด์„œ for...of ๋ฌธ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ ์œ ์‚ฌ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ์ง„์งœ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” Array.from

    Array.from์„ ์‚ฌ์šฉํ•˜๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ ์œ ์‚ฌ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ์ง„์งœ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค!

    ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ธฐ

    const arrayLike = {
        0: 1,
        1: 2,
        2: 3,
        length: 3
    };
    
    let realArray = Array.from(arrayLike); [1,2,3]
    realArray.pop();  // ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๊ฐ€๋Šฅ

    ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ธฐ

    let range = { 
        from: 1, 
        to: 5, 
    
        [Symbol.iterator]() { 
            this.current = this.from; 
            return this; 
        }, 
    
        next() { 
            if (this.current <= this.to) { 
                return { done: false, value: this.current++ }; 
            } else { 
                return { done: true }; 
            } 
        } 
    };
    
    console.log(Array.from(range));     // [1,2,3,4,5]

     

    5. ๋‚˜๋งŒ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ” ๋งŒ๋“ค์–ด๋ณด๊ธฐ

    0๋ถ€ํ„ฐ 10์ดํ•˜ ์ˆซ์ž๊นŒ์ง€ ์ˆซ์ž 2๋ฐฐ๋ฅผ ์ˆœํšŒํ•˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ๋งŒ๋“ค๊ธฐ

    const multiple = {
        [Symbol.iterator]() {
            const max = 10;
            let num = 0;
            return {
                next() {
                    return {value: num++ * 2, done: num > max}
                }
            }
        }
    
    }
    
    for(const num of multiple){
        console.log(num);       // 0, 2, 4, 6, 8 ..... 18
    }

    ์ดํ„ฐ๋ ˆ์ด์…˜์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๊ธฐ

    function makeIterable(InitailValue, maxValue, callback){
    return {
        [Symbol.iterator]() {
            const max = maxValue;
            let num = initialValue;
            return {
                next() {
                    return {value: callback(num++), done: num > max}
                }
            }
        }
    }
    }
    
    const multiple = makeIterable(0, 20, (n) => n * 2);
    
    for(const num of multiple){
        console.log(num)
    }

     

    6. ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์‚ฌ์šฉ

    ๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด ๋“ฑ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฏธ๋ฆฌ ํ™•๋ณดํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต๊ธ‰ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ๊ฒฝ์šฐ for...of ๋ฌธ์ด๋‚˜ ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น ๋“ฑ์ด ์‹คํ–‰๋˜๊ธฐ ์ด์ „๊นŒ์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋‹ค๊ฐ€, next()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ง€์—ฐ ํ‰๊ฐ€(lazy evaluation)์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    ์ง€์—ฐ ํ‰๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ์ƒ์„ฑํ•˜๋ฏ€๋กœ,

    • ๋น ๋ฅธ ์‹คํ–‰ ์†๋„๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๊ณ 
    • ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฌดํ•œ๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

    7. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

    ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต for...of ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ๋ฐ˜๋ณตํ•ด์„œ ์ผ์ด ์ญ‰ ์ˆ˜ํ–‰๋˜๊ณ  ์ง์ ‘ ๊ทธ ๋ฐ˜๋ณต์ด ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ฉˆ์ถœ ์ˆ˜ ์—†๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์ฝ”๋“œ ๋ธ”๋ก์˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ–ˆ๋‹ค๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ํ•จ์ˆ˜๋‹ค.

    ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€์˜ ์ฐจ์ด์ 

    1. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž์—๊ฒŒ ํ•จ์ˆ˜ ์‹คํ–‰์˜ ์ œ์–ด๊ถŒ์„ ์–‘๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž์™€ ํ•จ์ˆ˜์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    3. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ฝ”๋“œ ์‹คํ–‰์ด ์•„๋‹ˆ๋ผ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•

    1. ์ƒ์„ฑ

    • function* ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•˜๋ฉฐ,
    • ํ•˜๋‚˜ ์ด์ƒ์˜ yield ํ‘œํ˜„์‹์„ ํฌํ•จํ•œ๋‹ค.
    • ์ฃผ์˜ํ•  ์  : ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ •์˜ ์–ด๋ ต๊ณ , new ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

    2. ์‚ฌ์šฉ

    • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ
    • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ next ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด yield ๊ตฌ๋ฌธ ํ•˜๋‚˜์”ฉ ์‹คํ–‰๋œ๋‹ค.
    • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์—๋Š” ์ผ๋ฐ˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์—๋Š” ์—†๋Š” return๊ณผ throw๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค
    function* genFunc(){
    	yield 1;
    	yield 2;
    	yield 3;
    }
    
    const generator = gneFunc();
    
    console.log(generator.next()); // {value: 1, done: false}
    console.log(generator.return(30)); // {value: 30, done: true} // value์— ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ๋„ฃ๊ณ , ๋ฐ”๋กœ ๋ชจ๋“  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ ์™„๋ฃŒ์‹œ์ผœ๋ฒ„๋ฆฐ๋‹ค.
    
    console.log(generator.throw('Error!')); // ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , value์— undefined๋ฅผ, done์— true๋ฅผ ๊ฐ–๋Š” ์ด๋Ÿฌํ…Œ๋ฆฌ์–ด ๋ฆฌ์ ˆํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

     

    8. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์˜ ํ™œ์šฉ

    ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ตฌํ˜„

    ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ํ›จ์”ฌ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // ๊ธฐ์กด์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”
    const multiple = {
        [Symbol.iterator]() {
            const max = 10;
            let num = 0;
            return {
                next() {
                    return {value: num++ * 2, done: num > max}
                }
            }
        }
    
    }
    
    // ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•˜์—ฌ ๊ตฌํ˜„ํ•œ ์ดํ„ฐ๋Ÿฌ๋ธ” - ์ง„์งœ ๊ฐ„๋‹จ!!!
    function* multipleGenerator(){
        for(let i = 0; i<10; i++){
            yield i ** 2;
        }
    }

    ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์•ˆ,๋ฐ–์œผ๋กœ ์ •๋ณด ๊ตํ™˜

    function* gen(){
        let ask1 = yield "2 + 2 = ?";
    
        alert(ask1);
    
        let ask2 = yield "3 * 3 = ?";
    
        alert(ask2);
    }
    
    let generator = gen();
    
    alert(generator.next().value); // "2 + 2 = ?", ์•„์ง ask์—๋Š” ๊ฐ’์ด ๋‹ด๊ธฐ์ง€ ์•Š์Œ
    
    alert(generator.next(4).value); // 1) ๋จผ์ € ask1์— ๊ฐ’ ํ• ๋‹น, 2) value ์ถœ๋ ฅ "3 * 3 = ?" 
    alert(generator.next(9).done); // 1) ๋จผ์ € ask2์— ๊ฐ’ ํ• ๋‹น, 2) done ์ถœ๋ ฅ true

    ํ™œ์šฉ์˜ˆ์‹œ

    ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ๋งŒ๋“ค๊ธฐ : ๊ณ ์ •๊ฐ’์„ ๋ฐ›์•„ ์•„๋ž˜ ๊ณต์‹์„ ์‚ฌ์šฉํ•ด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ•จ์ˆ˜์ธ pseudoRandom(seed)

    function* pseudoRandom(seed) {
      let value = seed;
    
      while(true) {
        value = value * 16807 % 2147483647
        yield value;
      }
    
    };
    
    let generator = pseudoRandom(1);
    
    console.log(generator.next().value) // 16807
    console.log(generator.next().value) // 282475249
    console.log(generator.next().value) // 1622650073

     


     

     

    ์ฐธ๊ณ 

    ๋Œ“๊ธ€

Designed by Tistory.