-
[함수형 프로그래밍] generator 알아보기JavaScript 2022. 2. 22. 15:29
generate은 "만들어내다"라는 뜻을 가지고 있습니다.
즉, 제너레이터는 이터레이터이자 이터러블을 생성하는 함수를 말합니다.
문법은 function 키워드 앞에 * 을 붙이고, yield를 통해 next에 들어갈 값을 만들어줄 수 있습니다.
첫 번째 예제
function* gen() { yield 1; yield 2; yield 3; return 10 } let iter = gen(); console.log(iter[Symbol.iterator]() === iter); // true console.log(iter.next()); // {value: 1, done:true } console.log(iter.next()); // {value: 2, done:true } console.log(iter.next()); // {value: 3, done:true } console.log(iter.next()); // {value: 10, done:true } for(const val of iter){ console.log(val) // 1 ,2 3, 순으로 출력 }
간단한 제너레이터 함수입니다.
gen함수를 실행한 값을 가지고 있는 iter는 이터레이터입니다. 또한 이터러블이기도 합니다.
이터러블은 [Symbol.iterator]키를 가지고 있으며 실행한 결과는 이터레이터입니다. 즉, 자기 자신이 나옵니다.
따라서 첫번째 로그의 결과는 true입니다.
다음으로 yield에 들어가 있는 값을 하나씩 순회하며 value와 done프로퍼티를 가진 객체를 내보냅니다.
마지막 로그의 값은 value에 return에서 정의한 값이 들어가며 done이 true로 끝나게 됩니다.
이때 return의 값은 for... of문으로 순회를 하게 될 때 나오지 않습니다.
두 번째 예제
function* odds(limit) { for (let i = 0; i < limit; i += 1) { if (i % 2) yield i; } } let iter2 = odds(10); for (const a of iter2) { console.log(a); // 1 3 5 7 9 }
if문을 통해서 원하는 값을 출력할 수 있습니다.
위의 예시를 조금 더 바꿔보겠습니다.
function* infinite(start) { while (true) yield (start += 1); } function* odds(limit) { for (const val of infinite(1)) { if (val === limit) return; if (val % 2) yield val; } } let iter2 = odds(10); for (const a of iter2) { console.log(a); }
이렇게 만들더라도 위의 값과 같은 값을 만들 수 있습니다.
generator를 통해서 함수를 만들면 내가 표현하고 싶은 것을 더 잘 표현할 수 있게 만들어 주는 것 같습니다.
'JavaScript' 카테고리의 다른 글
[함수형 프로그래밍] reduce, go, pipe, curry 로 풀어보는 코딩테스트 (0) 2022.03.09 [Javascript] 프로토타입으로 상속 구현하기 (0) 2022.02.19 [함수형 프로그래밍] 잘 만들어진 이터레이터란? (well-formed iterator) (0) 2022.02.09 [함수형 프로그래밍] 이터레이터와 이터러블이란? (0) 2022.01.31 [JavaScript] 25 Beginner JavaScript Project Ideas 첫번째 만들기 (0) 2022.01.25