[함수형 프로그래밍과 ES6+] 제너레이터와 이터레이터

김성현·2023년 6월 12일
post-thumbnail

제너레이터와 이터레이터


제너러이터는 이터레이터이자 이터러블을 생성하는 함수를 말한다. 즉, 이터레이터를 리턴하는 함수다.

// 제너레이터는 일반 함수에서 앞에 별을 붙여 만든다.
function *gen() {
	yield 1;
	yield 2;
	yield 3;
  // 마지막에 return 값을 만들수도 있다.
	return 100;
}

//제너레이터를 실행한 결과는 이터레이터다.
let iter = gen();
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 2, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: undefined(or 100), done: true}

위와 같이 제너레이터를 통해 굉장히 쉽게 이터레이터를 만들 수 있다. 이 이터레이터는 이터레이터이자 이터러블이기도 하다. 이터레이터는 심볼 이터레이터를 가지고 있고, 그것의 실행 결과는 자기 자신이다. 그러니까 제너레이터는 Well-formed iterator 를 리턴하는 함수다.

console.log(iter[Symbol.iterator]() == iter); // true

그리고 제너레이터에서 yield를 통해서 몇번의 넥스트를 통해 값을 꺼내 줄 것인지를 정할 수 있다. 그리고 제너레이터를 사용하게 되면 그 실행결과가 이터러블이자 이터레이터이기 때문에 순회할 수 있다.

for (const a of gen()) console.log(a);

제너레이터라는 문장을 통해 순회할 수 있는 값을 만들 수 있기 떄문에 자바스크립트에서는 이를 이용해 어떠한 상태나 어떠한 값이든 순회할 수 있게 만들 수 있다. 이는 함수형 프로그래밍의 관점에서 굉장히 중요한 부분이다.

또한 다형성이 굉장히 높다.

제너레이터를 사용해서 홀수만 계속해서 발생시키며 순회하는 예제


function *odds() {
	yield 1;
	yield 3;
	yield 5;
	yield 7;
}
let iter2 = odds();
console.log(iter2.next()):
console.log(iter2.next()):
console.log(iter2.next()):
console.log(iter2.next()):
console.log(iter2.next()):

위의 코드를 자동화해서 만들면 아래와 같다.

0개의 댓글