[해당 이미지는 다음 링크에서 사용했습니다 : http://welllin.net/javascript-es6-generator/]
#제네레이터함수 #“어디에” 제네레이터 함수를 써야 하는가? #느긋한계산 #무한생성
이 블로그는 제네레이터 함수 공부하며 참고한 블로그 내용을 재 가공해 작성 한 글입니다.
중복되는 용어와 해당 부분에 대해 링크를 정리했습니다.
궁금하신 분은 주소를 클릭하면 원문을 읽을 수 있습니다.
지난 글 이론편에서 "왜 제네레이터 함수를 사용하는지"를 다뤘습니다.
오늘 우리는 제네레이터 함수가 어디에 쓰이는지, 본격적으로 제네레이터 함수가 무엇인지 에 대해 하나씩 살펴볼 것 입니다.
블로그를 이론적인 부분과 코드편으로 나눠 작성됩니다. 현재 이론편을 다루고 있습니다.
(각각의 모든 글 하단에 참고&인용한 블로그 링크를 추가했습니다.)
[1]. “왜” 제네레이터 함수를 써야 하는가?
[2]. “어디에” 제네레이터 함수를 써야하는가?
[3]. 제네레이터 함수의 "정의"와 "작동원리"는 무엇인가?
제네레이터가 자주 사용되는 경우는 다음의 3가지 경우
가 있다 생각합니다.
Promise(Async/await)
: 제네레이터는 앞선 편에서 설명한 것처럼, 비동기 프로그래밍을 동기적으로 작성하고 관리하는데 사용됩니다.
Promise자체로도 비동기 프로그래밍을 다루는데 하등 문제가 없지만 제네레이터와 함께 사용하면 코드의 가독성과 관리적 측면이 향상됩니다.
제네레이터 함수 형태가 Async/await와 비슷한 것을 확인할 수 있습니다.
Async함수는 Promis를 반환하며 콜백함수가 성공을 하든 실패하든 우선 await에서 값을 받을 때 까지 대기합니다.
자세한 설명은 나중에 Async/awiat 편에서 다루겠습니다.
function * generator-promise() {
let a=yield Promise1();
console.log(a);
let b=yield Promise1();
console.log(b);
let c=yield Promise1();
console.log(c);
}
generator-promise함수는 매번 실행하면서 yield를 만나 정지
합니다.
제네레이터 함수는 실행하면 Promise1 결괏값을 yield(넘겨주고)하고 함수를 종료합니다. 다시 (제네레이터)함수가 실행하면 이 값을 변수 a에 저장됩니다.
이런 과정을 통해 Promise 값이 변수 a, b, c에 저장되고 console.log를 통해 확인 가능합니다.
Infinite Data Generator
제네레이터는 기본적으로 값을 생성하는(Generate)하는 무엇(tor) 입니다. 즉. 값을 생성하는 조건을 "무한(infinte)"으로 할 경우, Infinite Data Generator 가 가능합니다.
함수의 생성자(constructor)와 다른 내용이라고 생각합니다.
function * randomize() {
while (true) {
let random = Math.floor(Math.random()*1000);
yield random;
}}
var random= randomize();
while(true)
console.log(random.next().value)
function * naturalNumbers() {
let num = 1;
while (true) {
yield num;
num = num + 1
}
}
const numbers = naturalNumbers();
console.log(numbers.next().value)
console.log(numbers.next().value)
// 1
// 2
randomize는 random한 값을 무한이 발생시키는 제네레이터 함수 입니다,
반면 naturalNumbers는 num값을 하나씩 증가하는 함수입니다.
두 함수 값을 무한히 생성하는 구조는 동일합니다.
while(true){
....
}
randomize함수는 변수 random에 random 한 값을 생성합니다.
while (true) {
let random = Math.floor(Math.random()*1000);
yield random;
}}
randomize()함수가 무한히(infinite) 작동하는 조건
입니다.
코드는 항상 true를 출력하기 때문에 제네레이터 함수는 넘겨준 (yield) 값을 console.log(random.next().value) 합니다.
console.log(random.next().value)
randome.next().value를 통해 "값"이 출력됩니다.
숫자가 나오는 이유는 제네레이터 함수는 다음 형태로 객체를 출력하기 때문입니다.
{value : "어떤 숫자" , done: true 혹은 false }
느긋한 계산(Lazy evaluation)
을 할 수 있습니다.이미 “왜” 제네레이터 함수를 써야 하는가?에서 다룬 내용입니다.
값을 연산 후 일정 시간을 지연(delay)시켜 값을 필요할 시점에 사용
할 수 있습니다.
느긋한 계산이란?
컴퓨터 프로그래밍에서 느긋한 계산법(Lazy evaluation)은 계산의 결과값이 필요할 때까지 계산을 늦추는 기법이다.
느긋하게 계산하면 필요없는 계산을 하지 않으므로 실행을 더 빠르게 할 수 있고, 복합 수식을 계산할 때 오류 상태를 피할 수 있고, 무한 자료 구조를 쓸 수 있고, 미리 정의된 것을 이용하지 않고 보통 함수로 제어 구조를 정의할 수 있다.
느긋한 계산법을 사용하는 언어들은 "이름으로 호출"하거나 "필요할 때 호출"하는 계산 전략을 사용하는 것으로 나눌 수 있다.
-위키백과 중-
이것으로 “어디에" 제네레이터 함수를 써야 하는가?에 대해 다뤘습니다.
generator-promise함수 코드
: https://medium.freecodecamp.org/yield-yield-how-generators-work-in-javascript-3086742684fc
randomize함수 코드
: https://codeburst.io/understanding-generators-in-es6-javascript-with-examples-6728834016d5
느긋한 계산 정의
: https://ko.m.wikipedia.org/wiki/느긋한_계산법