728x90

Java의 Iterator와 비슷한 느낌을 갖는 function이다. 표기법으로는 function 또는 function 으로 자신이 쓰고 싶은 방법대로 작성하면 된다.

왜 Iterator와 비슷한가? 보통 Iterator는 Collection에 들어가며, 내가 넣은 요소를 탐색하는 요소로 사용된다.

function에도 동일하게 내가 요소(구간)을 만들어 다음 로직의 요소(구간)을 실행할 수 있도록 function을 실행 구간을 블록킹할 수 있게 된다.

function* goStop() {
	console.log("go");
	yield "Stop";
	console.log("go2");
	yield "Stop2";
}

function* generateName() {
  yield 'W';
  yield 'O';
  yield 'N';
  yield 'I';
  yield 'S';
  yield 'M';
}

// for..of
const genForForOf = generateName();
for (let i of genForForOf) {
  console.log(i);
}

이터러블하기 때문에 of에 넣어도 동작한다.

어느 상황에서 유용할까?

모질라 페이지에서는 아래와 같이 설명한다.

Generators in JavaScript — especially when combined with Promises — are a very powerful tool for asynchronous programming as they mitigate — if not entirely eliminate -- the problems with callbacks, such as Callback Hell and Inversion of Control. However, an even simpler solution to these problems can be achieved with async functions.

비동기 프로그래밍에서 유용하다고 하는데 나는 다음과 같이 생각한다.

  • 여러 번에 걸쳐서 실행되어야 하는 하나의 로직 단위

우리는 보통 아토믹하게 작은 단위로 함수를 만들고 이를 조합해서 사용하며, 이는 재사용성에 의해 코드의 복잡도가 낮아진다고 말한다. 하지만 제너레이터 함수에 의해 함수의 동작을 내가 로직 단위로 쪼개서 조작할 수 있다.

로직은 하나의 흐름이지만, 로직 중간 중간 어느 시점에 이어서 진행되어야 하는 시점이 있다면 어떻게 될까?

일상 생활에 예를 들어보자.

나는 컴퓨터를 켜서 C언어를 공부한다고 생각하자.

C언어의 하나의 챕터를 공부하는 function* studyForC() {} 수행 중 이다.

하지만 모든 시간 내가 온전히 C언어를 공부하는 것이 아니다. 중간 중간 화장실에 가야 하기도 하고, 물도 마셔야 한다.

함수 실행의 주체를 공부가 아닌 나로 바꿔서 로직을 실행한다고 해보자.

javscript function Human() {

// studyForC.next() 시작 0~9페이지

// 화장실

// studyForC.next() 10~19페이지

// 물마시기

// studyForC.next() 20~29페이지

}

만약에 이를 제너레이터 함수가 아닌 다른 방법으로 실행했어야 했다면, 화장실 갔다 온 뒤 Callback함수로 넘겨 매 행위를 정해줘야 했을 것이다.

다른 언어에서 이런 함수를 제공하는지는 모르겠지만, 자바스크립트는 역시 난해하고 이상한 친구인듯 하다.

 

반응형

+ Recent posts