ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JavaScript ES6 제너레이터와 이터레이터
    프로그래밍/JavaScript 2019. 5. 31. 13:48
    반응형

    제너레이터 / 이터레이터

    • 제너레이터 : 이터레이터이자 이터러블을 생성하는 함수, 함수 이름 앞에 *를 붙여 사용합니다.
    <script>
    function *gen(){
        yield 1;
        if(false) yield 2;
        yield 3;
        return 100;    // Return 값 생성 가능, 마지막 done 일때 반환함
    }
    let iter = gen();
    console.log(iter[Symbol.iterator]() == iter);
    console.log(iter.next());
    console.log(iter.next());
    console.log(iter.next());
    console.log(iter.next());
    
    for(const a of gen()) console.log(a);
    </script>

    Odds 홀수

    <script>
    function *infinity(i=0){
        while(true) yield i++;
    }
    
    function *limit(l, iter){
        for(const a of iter){
            yield a;
            if(a == l) return;
        }
    }
    
    function *odds(l){    // 10보다 작은 홀수는 뽑는 제너레이터 함수
        for(const a of infinity(1)){
            if(i$2) yield a;
            if(a==l) return;
            }
        }
    }
    let iter2=odds(10); // Limit 값
    console.log(iter2.next());
    console.log(iter2.next());
    console.log(iter2.next());
    console.log(iter2.next());
    console.log(iter2.next());
    console.log(iter2.next());
    console.log(iter2.next());
    
    for(const a of odds(40)) console.log(a);
    </script>

    for of, 전개 연산자, 구조 분해, 나머지 연산자의 사용

    <script>
    console.log(...odds(10);
    console.log([...odds(10), ...odds(20)]);
    
    const [a, b, ...rest] = odds(10);
    console.log(a);
    console.log(b);
    console.log(rest);
    </script>

    과정 후기

    홀수를 만드는 함수를 제너레이터 함수를 이용해서 만들어본 과정이였다. 처음에 함수에 * 을 사용해서 무슨 뜻인가 잘 몰라서 구글링을 좀 했다. 아직도 완벽히 이해가 된 단계는 아닌것같지만 대략적으로는 알것같다.
    while 반복문을 사용할시에 보통 true 값을 주게되면 무한으로 계속 작동되기에 브라우저가 뻗어버리는 경우가 존재하는데 제너레이터 함수를 이용해서 반복문을 돌릴시에는 limit 값을 주지 않을 경우에 한정없이 작동하지만 실행할때만 작동하므로 원하는 값을 지연시킬수있다는 생각이 들었다. 사실 지연시킨다는 의미는 아니지만 이걸 어떻게 표현해야할지는 참 애매모호한것같다. 실제로 어디에 사용해볼수 있을까 생각했는데 회원 가입을 할때마다 회원수 측정을 위해서 SQL에서 auto_increment 값을 주게되면 데이터가 추가될때마다 1씩 숫자가 증가되는데 회원수는 limit 값을 일반적으로 주지 않으므로 회원 가입될때마다 1씩 값을 증가해나가야하는데 이때 while이나 for문을 그냥 돌리면 숫자가 무한정으로 늘어나버린다. 하지만 제너레이터 함수를 사용하여 1씩 증가시키는 함수를 만든다면 해당 함수가 실행될때만 숫자가 증가하고 다음번에 실행될때에도 마지막 값에서 1씩 증가되므로 원하는 값을 얻을수 있다. 다만 요런 용도로 제너레이터 함수가 쓰이는건지는 아직 잘 모르겠지만 강좌 리스트를 보면 나중에 실예제도 만드는걸로 봐서 그 강좌에서 이해할수 있지 않을까 기대하고있다.

    반응형

    댓글

Designed by Tistory.