제너레이터와 async/await

어승준·2023년 10월 21일

JS 스터디

목록 보기
18/26
post-thumbnail

📌 Async Await이 Promises 및 콜백을 사용하는 것과 비교했을 때 코드의 가독성과 유지 보수성을 어떻게 향상시키는지 설명해 주세요.

  • 가독성
    • async/await으로 비동기 코드를 동기적으로 작성하는 과정이 promise의 chaining 보다 직관적
  • 유지보수성
    • 비동기 코드의 명확한 흐름, 함수 분리 -> 코드 모듈화 가능

📌 제너레이터 함수의 실행 과정을 next, yield를 포함해 설명하세요

function* simpleGenerator() {
  console.log("첫 번째 yield 이전");
  yield 1;
  console.log("두 번째 yield 이전");
  yield 2;
  console.log("제너레이터 함수 종료");
}

// 제너레이터 객체 생성
const generator = simpleGenerator();

// next 호출과 실행 과정
console.log("제너레이터 시작");
const result1 = generator.next(); // "첫 번째 yield 이전"을 출력하고 1을 반환
console.log(result1.value); // 출력: 1
console.log(result1.done); // 출력: false

const result2 = generator.next(); // "두 번째 yield 이전"을 출력하고 2를 반환
console.log(result2.value); // 출력: 2
console.log(result2.done); // 출력: false

const result3 = generator.next(); // "제너레이터 함수 종료"를 출력하고 undefined를 반환, 함수 종료
console.log(result3.value); // 출력: undefined
console.log(result3.done); // 출력: true
  1. function*키워드로 선언하여 제너레이터 함수를 호출

  2. next 메서드를 호출하여 제너레이터 함수의 실행을 시작합니다. 함수는 yield 키워드를 만날 때까지 실행되며, 해당 yield 표현식의 값을 반환하고 일시 중단됩니다. done 프로퍼티는 false로 설정됩니다.

  3. 제너레이터 함수가 일시 중단되면 호출자는 필요한 작업을 수행하거나 다른 동작을 실행할 수 있습니다.

  4. 추가 next 호출을 통해 함수를 재개하면 이전에 중단된 지점에서 코드가 실행되고, 다음 yield 키워드를 만날 때까지 진행됩니다. 이때 yield 표현식의 값을 반환하고, done 프로퍼티는 여전히 false로 유지됩니다.

  5. 이러한 단계를 반복하여 필요한 만큼 값을 가져오고, 모든 yield를 만난 후 done 프로퍼티가 true로 변경되면 함수의 실행이 종료됩니다.


📌 제너레이터란 무엇이며 어떤 상황에서 사용되나요?

  • 제너레이터란, 코드 블록의 실행을 일시 중지했다가 필요한 시점에 재개할 수 있는 특수한 함수다.

  • 제너레이터 함수는 반복적으로 값을 내보내고, 호출자는 필요할 때 값을 가져와서 함수의 실행을 제어할 수 있습니다. 이러한 특성은 비동기 작업을 조절하거나 순차적인 작업을 구현하는 데 유용하게 활용됩니다


📌 제너레이터와 일반 함수의 차이는 무엇인가요?

  1. 제너레이터 함수는 함수 호출자에게 함수 실행의 제어권을 양도할 수 있다.

    • 일반 함수를 호출하면 제어권이 함수에게 넘어가고 함수 코드를 실행한다. 즉, 함수 호출자는 함수를 호출한 이후 함수 실행을 제어할 수 없다. 제너레이터 함수는 함수 호출자가 함수 실행을 일시 중지시키거나 재개시킬 수 있도록 제어권을 가진다.
  2. 제너레이터 함수는 함수 호출자와 함수의 상태를 주고받을 수 있다.

    • 일반 함수를 호출하면 매개변수를 통해 값을 받고 함수 코드를 실행하여 결과값을 반환한다. 즉, 함수가 실행되고 있는 동안에는 함수 외부에서 함수 내부로 값을 전달하여 함수의 상태를 변경할 수 없다. 제너레이터 함수는 함수 호출자와 양방향으로 상태를 서로 주고 받을 수 있다.
  3. 제너레이터 함수를 호출하면 제너레이터 객체를 반환한다.

    • 일반 함수를 호출하면 함수 코드를 실행하고 값을 반환한다. 제너레이터 함수를 호출하면 함수 코드를 실행하는 것이 아니라 이터러블이면서 동시에 이터레이터인 제너레이터 객체를 반환한다.

📌 await 키워드 사용 조건 두 가지를 말해 주세요.

  • await 키워드는 반드시 async 함수 내부에서 사용해야 한다
  • 클래스의 constructor 메서드에서는 async 사용 불가능하다. 클래스의 constructor 메서드는 인스턴스를 반환해야하지만 async 함수는 프로미스를 반환하기 때문이다.
profile
鈍筆勝聰(둔필승총) : '둔한 붓이 총명함을 이긴다' (서툴더라도 기록으로 남기는 것이 사람의 기억보다 훨씬 오래 보전된다) - 정약용

0개의 댓글