본 시리즈는 인프런 강의 함수형 프로그래밍과 JavaScript ES6+ ( 지식 공유자 : 유인동 님 ) 의 강의를 수강하면서 내용을 제 방식대로 포스팅하는 글입니다.
제너레이터란?
이터레이터 이자 이터러블을 생성하는 함수를 말한다.
다시 말하자면, 이터레이터를 리턴하는 함수이다.
// 제너레이터 : 이터레이터 이자 이터러블을 생성하는 함수
// yield 를 통해서 몇번의 next 를 사용해 값을 꺼내게 해줄 것인지 정할수 있다.
function* gen() {
yield 1;
yield 2;
yield 3;
}
let iter = gen();
// 이터레이터는 Symbol.iterator 를 가지고 있다.
console.log(iter[Symbol.iterator]); // [function iterator]
console.log(iter[Symbol.iterator]() === iter); // true, 제너레이터는 well formed 이터레이터를 반환하는 함수이다.
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, done: true}
제너레이터를 사용하게 되면, 제너레이터의 실행결과가 이터러블 이자 이터레이터 이기 때문에 순회할수 있다.
// 제너레이터 : 이터레이터 이자 이터러블을 생성하는 함수
// yield 를 통해서 몇번의 next 를 사용해 값을 꺼내게 해줄 것인지 정할수 있다.
function* gen() {
yield 1;
// 제너레이터는 순회할값을 문장으로 표현하는 것이라고도 말할수 있다.
if (false) yield 2;
yield 3;
// 제너레이터 문법은 마지막에 return 값을 만들수 있다.
// 유의 해야 할것은, 순회할때 return 값은 무시된다.
// 마지막 done 이 true 가 될때 나오는 value 값이라고 이해하면 된다.
return 100;
}
let iter = gen();
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: 100, done: true}
console.log(iter.next()); // {value: 100, done: true}
// 제너레이터 실행결과는 이터러블
for (const a of gen()) console.log(a); // 1 3
그래서, JS 에서는 어떤 값이던 간에 이터러블 이면 순회할수 있다.
그런데 제너레이터는 문장을 값으로 만들수 있고, 문장을 통해 순회할수 있는 값을 만들수 있기 때문에
JS 에서는 이 제너레이터를 통해서 어떤 값이나 상태던 사실상 순회할수 있기 만들수 있다는 이야기가 된다
이 점이 굉장히 상징적이고 함수형 프로그래밍 관점에서도 중요하다.
JS 는 굉장히 다형성이 높다고 말할수 있다.
제너레이터 라는 문장을 통해 순회할수 있는 값을 만들수 있다는 이야기는
어떠한 값이나 상태도 순회할수 있는 형태로 제너레이터 문장을 통해서 조작할수 있으며,
제너레이터를 통해서 굉장히 다양한 값들을 순회할수 있는 이터러블을 쉽게, 프로그래머가 로직을 만들어가면서 순회를 시킬수 있다는 이야기 이다.
'Javascript' 카테고리의 다른 글
for...of, 전개 연산자, 구조 분해, 나머지 연산자 - JS ES6+ 함수형 프로그래밍 - 10 (0) | 2022.09.11 |
---|---|
JS - 제너레이터를 이용한 홀수 반환 함수 - JS ES6+ 함수형 프로그래밍 - 9 (0) | 2022.09.09 |
전개 연산자 ( Spread Operator ) - JS ES6+ 함수형 프로그래밍 - 7 (2) | 2022.09.09 |
사용자 정의 이터러블, 이터러블 / 이터레이터 프로토콜 정의 - JS ES6+ 함수형 프로그래밍 - 6 (0) | 2022.09.09 |
Array, Set, Map 을 통해 알아보는 이터러블 / 이터레이터 - JS ES6+ 함수형 프로그래밍 - 5 (0) | 2022.09.08 |