[DEV] 03 - 제너레이터 (함수형프로그래밍 es06)

headerimg
함수형 프로그래밍과 javascript es6를 깊게 파보기.


제너레이터(Generator)

  • 제너레이터: 이터레이터이자 이터러블을 생성하는 함수. function* 선언 (끝에 별표가 있는 function keyword) 은 generator function 을 정의하는데, 이 함수는 Generator 객체를 반환합니다.(by MDN)
    Generator 객체는 generator function 으로부터 반환된 값이며 반복자와 반복자 프로토콜을 준수합니다.(by MDN)
function* generator(i) {
  // 1번째 호출.
  yield i; 
  
  // 2번째 호출
  yield i + 10;

  // 마지막 호출
  return i * 10; 
}

const iter = generator(10);

// 이터레이터이자 이터러블이다.
console.log(iter[Symbol.iterator]() === iter); // true

console.log(iter.next().value); // 10
console.log(iter.next().value); // 20
console.log(iter.next().value); // 100
console.log(iter.next()); // { value: undefined, done: true}

// for-of 호출 시 return은 호출되지 않는다.
for(const v of gen(1)) console.log(a);
// 1
// 11

제너레이터 객체는 이터레이션 프로토콜을 따르기 때문에 순회할 수 있다.


제너레이터 예제

하나씩 천천히 따라 해보면 뭔가 감이 싹 온다.

// 무한 숫자
function *infinity(i = 0){
    while(true) yield i++;
}

const iter = infinity(1);

console.log(iter.next().value); // 1
console.log(iter.next().value); // 2
console.log(iter.next().value); // 3
console.log(iter.next().value); // 4


짝수 홀수 가져오기


// 무한 숫자 제너레이터
function* infinity(i = 0){
    while(true) yield i++;
}

// 짝 홀 제너레이터
function *oddEven(oddEven = 0){
  for(n of infinity(1)){
    if(n % 2 === oddEven) yield n;
  }
}
const iter = oddEven(0);

console.log(iter.next().value); // 2
console.log(iter.next().value); // 4
console.log(iter.next().value); // 6
console.log(iter.next().value); // 8


원하는 숫자만큼 가져오기

// 무한 숫자 제너레이터
function* infinity(i = 0){
    while(true) yield i++;
}

// 제한 숫자 정해놓기
function* limit(limitNum, iter){
  for(const v of iter){
    yield v;
    if(v === limitNum) return;
  }
}

// 짝 홀 제너레이터
function* oddEven(oddEven = 0, limitNum){
  for(const n of limit(limitNum, infinity(1))){
    if(n % 2 === oddEven) yield n;
  }
}

for(const a of oddEven(1, 10)) console.log(a);

// 1
// 3
// 5
// 7
// 9


for-of, 전개 연산자, 구조 분해, 나머지 연산자

끼워 넣기

console.log(...oddEven(1, 10));
// 1,3,5,7,9

console.log([...oddEven(0, 10), ...oddEven(1, 10)])
// [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

const [head, ...body] = oddEven(0, 10);
console.log(head, body)
// 2 [4, 6, 8, 10]

© 2018. All rights reserved.