- 제너레이터(Generator) 목차
| Generator 란 ?
제너레이터의 핵심은 동시성
프로그래밍입니다.
( 동시성이란?
- 동시에 여러가지 일을 처리하는 것처럼 행동하는 것입니다.
- 병행과 병렬을 혼동하면 안됩니다.
- 병렬은 실제로 동시에 여러가지 일을 처리하는 것입니다. )
동시성의 예로,javascript
는 싱글 스레드 입니다.( 이말은 ? 한 번에 한 가지 일 밖에 못 한다는 뜻 )
하지만 실제로 javascript는 한 번에 여러 가지 일을 처리하는 것을 우리는 알고 있습니다.
ex) ajax 요청을 한다고 해서 "응답이 올 때까지 시스템은 멈추지 않는다."
결론은 javascript
는 싱글 스레드이지만, event 루프를 통해 동시성
을 지원하고 있습니다.
제너레이터
는 이터레이터
에 의존하는 개념으로, 이터레이터를 사용해 자신의 실행을 제어하는 함수입니다.
따라서 제너레이터는 이터레이터를 반환하므로 for.. of 루프에서 사용이 가능합니다.
function* gen(){
...
}
for(test of gen() ){
console.log(test);
}
위와 같이 반복문으로 사용이 가능합니다.
일반 함수와 뭐가 다를까 ?
일반적인 함수
- 일반적으로 함수가 실행 되면 함수가 종료될 때까지 동작합니다. (= 함수가 실행되는 순간 종료될 때까지 제어할 수 있는 방법 X )
- 매개변수를 받고 값을 반환합니다.
- 하지만, 여기서 매개변수 이외에 함수의 실행을 제어할 방법이 없습니다.
- 함수를 호출하면 해당 함수가 종료될 때까지 제어권을 완전히 넘기는 것.
제너레이터 함수
- 하지만 제너레이터는 위의 일반적인 함수와 조금 다릅니다.
-
- 함수의 실행을 개별적 단계로 나눠 제어합니다.
-
- 실행 중인 함수와 통신합니다.
다시말해, generator
는 두 가지 예외를 제외하면 일반적인 함수와 같습니다.
제너레이터는 호출한 즉시 실행되지 않는 대신에, 이터레이터 (iterator)
를 반환하고 이터레이터의 next()
메서드를 호출함에 따라 실행됩니다.
제너레이터는 언제든지 호출자에게 제어권을 넘길 수 있습니다 (= yield
)
즉, 함수가 실행되는 순간 종료될때까지의 제어권을 제어할 수 있습니다. 호출자에서 모든 제어권을 가지지 않기 때문에 호출자는 제어권을 제너레이터에게 넘깁니다.
위 사진과 같이 제너레에티어 역시 원하는 시점에 다시 호출자에게 제어권을 넘길 수 있습니다. (양방향이 가능합니다.)
문법
제너레이터(Generator)는 function
에 에스터리스크 기호인 *
를 붙여 사용합니다.
또한 retrun
대신 yield
키워드를 사용합니다.
사용예시
function* f1(){
console.log('f1-1');
yield 10;
console.log('f1-2');
yield 20;
console.log(`f1-3 ');
return 'finished';
}
//f1 함수 실행
const gen = f1();
//제너레이터 f1() 호출
console.log(get.next());
또한 generator
는 yield
를 통해 나온 결과 값에서, 해당 결과값인 value
와 함수의 종료 여부인 done
이 존재합니다.
console.log(get.next())
// {value : ... done : true }
위의 코드와 같이 done
의 결과값이 true
이면 해당 함수는 완전이 끝났음을 의미합니다false
일 경우에는 함수가 종료되지 않았음을 의미합니다.
즉, 함수를 완전히 종료시키려면 done
의 값이 true
가 될 때까지 next()
를 호출하면 됩니다.
'React' 카테고리의 다른 글
[React] soket.io version2 리액트 소켓IO 사용기 (0) | 2021.08.22 |
---|---|
리액트의 Switch는 언제 사용할까? (0) | 2021.03.17 |
리덕스 reselect 사용하기 (0) | 2021.02.22 |
react-redux의 shallowEqual 사용하기 (0) | 2021.02.22 |
redux-saga (0) | 2021.02.21 |