티스토리 뷰

React

제너레이터(Generator)

Xion 2021. 2. 23. 16:11

| Generator 란 ?

제너레이터의 핵심동시성 프로그래밍입니다.
( 동시성이란?

  • 동시에 여러가지 일을 처리하는 것처럼 행동하는 것입니다.
  • 병행과 병렬을 혼동하면 안됩니다.
  • 병렬은 실제로 동시에 여러가지 일을 처리하는 것입니다. )

동시성의 예로,
javascript싱글 스레드 입니다.( 이말은 ? 한 번에 한 가지 일 밖에 못 한다는 뜻 )

하지만 실제로 javascript는 한 번에 여러 가지 일을 처리하는 것을 우리는 알고 있습니다.
ex) ajax 요청을 한다고 해서 "응답이 올 때까지 시스템은 멈추지 않는다."

결론은 javascript 는 싱글 스레드이지만, event 루프를 통해 동시성 을 지원하고 있습니다.

제너레이터이터레이터에 의존하는 개념으로, 이터레이터를 사용해 자신의 실행을 제어하는 함수입니다.
따라서 제너레이터는 이터레이터를 반환하므로 for.. of 루프에서 사용이 가능합니다.

function* gen(){
    ...
}

for(test of gen() ){
    console.log(test);
}

위와 같이 반복문으로 사용이 가능합니다.

일반 함수와 뭐가 다를까 ?

일반적인 함수

  • 일반적으로 함수가 실행 되면 함수가 종료될 때까지 동작합니다. (= 함수가 실행되는 순간 종료될 때까지 제어할 수 있는 방법 X )
  • 매개변수를 받고 값을 반환합니다.
  • 하지만, 여기서 매개변수 이외에 함수의 실행을 제어할 방법이 없습니다.
  • 함수를 호출하면 해당 함수가 종료될 때까지 제어권을 완전히 넘기는 것.

제너레이터 함수

  • 하지만 제너레이터는 위의 일반적인 함수와 조금 다릅니다.
    1. 함수의 실행을 개별적 단계로 나눠 제어합니다.
    1. 실행 중인 함수와 통신합니다.

다시말해, 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());

또한 generatoryield 를 통해 나온 결과 값에서, 해당 결과값인 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