똑같은 삽질은 2번 하지 말자

Javascript ES6+ 에서 함수형 프로그래밍(제너레이터) 본문

Javascript

Javascript ES6+ 에서 함수형 프로그래밍(제너레이터)

곽빵 2021. 8. 21. 17:29

제너레이터

이터레이터이자 이터러블을 생성하는 함수

 

난생처음 보는 함수..이다

function* generator(){
  yield 1;
  yield 2;
  yield 3;
}

let iter = gen()

log(iter[Symbol.iterator]() == iter) // true => well-formed iterator이다
log(iter.next()) // value: 1 done: false
log(iter.next()) // value: 2 done: false
log(iter.next()) // value: 3 done: false
log(iter.next()) // value: undefined done: true

for(const i of iter) console.log(i) // 순회가능
  1. 제네레이터 함수를 일단 처음 실행해도 아무일도 일어나지 않는다. 그냥 제네레이터 객체가 리턴된다.
  2. 제네레이터 객체는 next() 메소드를 실행할 때마다 다음 yield 문까지 실행되고 정지한다. 다시 next()를 실행하면 아까 멈췄던 yield 부터 다음 yield까지 실행하고 다시 정지한다.
  3. 더 이상 yield가 없으면 제네레이터의 실행은 완전히 종료된다.

여기서, 제네레이터 객체는 이터레이터 객체이고(next() 메소드를 구현했음) 제네레이터 함수는 이터러블 객체이다(이터레이터를 반환함)

 

그리고 제너레이터로 상당히 상징적인 것을 할 수 있는데,

function* generator(){
  yield 1;
  if (false) yield 2;
  yield 3;
}

let iter = generator()


for(const i of iter) console.log(i) // 1 3

위와 같이 문장(특정한 로직)을 통해서 순회할 수 있는 데이터 스트림을 만들어 낼 수 있다.

 

내가 원하는 범위에서 순회가능한 홀수들을 가진 iterable을 만들어보자

function* odds(start, end) {
    let i = start%2 ? start : ++start;
    while(i <= end) {
        yield i;
        i += 2
    }
  }

  for(const odd of odds(1, 15)) console.log(odd)

 

다양한 generator 활용방법(꽤 신박한 방법이었다.. 강의에서 가져온 코드)

function* infinity(i = 0) { // 무한대의 순회가능한 iterable
  while (true) yield i++;
}

function* limit(l, iter) { // 주어진 범위내의 순회가능한 iterable
  for (const a of iter) {
    yield a;
    if (a == l) return;
  }
}

function* odds(l) { // 홀수들
  for (const a of limit(l, infinity(1))) { // 짬뽕 시키기
    if (a % 2) yield a;
  }
}

for (const a of odds(10)) log(a); // 1 3 5 7 9 

console.log(...odds(10)); // 1 3 5 7 9 
console.log([...odds(10), ...odds(20)]); // 1 3 5 7 9 1 3 5 7 9 11 13 15 17 19 

const [head, ...tail] = odds(5);
console.log(head); // 1
console.log(tail); // 3 5

const [a, b, ...rest] = odds(10);
console.log(a); // 1
console.log(b); // 3 
console.log(rest); // 5 7 9

 

이렇게 제너레이터로 손쉽게 이터러블을 만들어 낼 수 있으며, 제너레이터나 이터레이터들을 잘 활용하면 좀 더 조합성이 높은 

프로그래밍을 할 수 있다.

Comments