Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript yield* 표현식 완벽 정리 – 제너레이터와 이터러블 위임하기

JavaScript의 yield* 표현식이란?

JavaScript의 yield* 표현식은 다른 제너레이터(generator) 함수 또는 이터러블(iterable) 객체에 반복 작업을 위임할 때 사용되는 특수한 문법입니다. 일반적인 yield가 단일 값만 하나씩 반환하는 것과 달리, yield*는 위임된 대상이 가진 모든 값을 순서대로 자동으로 산출합니다.

쉽게 말해, 한 제너레이터 안에서 다른 제너레이터나 배열 같은 이터러블을 호출하고 그 결과를 그대로 이어받고 싶을 때 yield*를 활용하면 코드를 훨씬 간결하게 작성할 수 있습니다.

yield*의 주요 특징

  • 다른 제너레이터 함수가 산출하는 모든 값을 순차적으로 위임받아 반환합니다.
  • 배열, 문자열, Map, Set 등 모든 이터러블 객체에 사용할 수 있습니다.
  • yield* 표현식 자체는 위임된 이터레이터가 종료될 때 반환하는 값(return 값)으로 평가됩니다.

예제 코드

다음은 JavaScript에서 yield* 표현식을 실제로 구현한 예제입니다. 버튼을 클릭하면 test2 제너레이터가 test 제너레이터에 위임하여 값을 순서대로 출력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
   body {
      font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
   }
   .result {
      font-size: 20px;
      font-weight: 500;
      color: blueviolet;
   }
</style>
</head>
<body>
<h1>JavaScript의 yield* 키워드</h1>
<div class="result"></div>
<br />
<button class="Btn">CLICK HERE</button>
<h3>위 버튼을 클릭하면 test2를 순회하며 산출된 값을 확인할 수 있습니다.</h3>
<script>
   let resEle = document.querySelector(".result");
   let BtnEle = document.querySelector(".Btn");
   function* test() {
      yield 12;
      yield 24;
      yield 36;
   }
   function* test2() {
      yield* test();
   }
   let iterator = test2();
   BtnEle.addEventListener("click", () => {
      resEle.innerHTML = iterator.next().value + "<br>";
      resEle.innerHTML += iterator.next().value + "<br>";
      resEle.innerHTML += iterator.next().value + "<br>";
   });
</script>
</body>
</html>

실행 결과

위 코드를 브라우저에서 실행하면 다음과 같은 초기 화면이 나타납니다.

JavaScript yield* 표현식 완벽 정리 – 제너레이터와 이터러블 위임하기

'CLICK HERE' 버튼을 클릭하면 −

JavaScript yield* 표현식 완벽 정리 – 제너레이터와 이터러블 위임하기

동작 원리 상세 설명

  1. test() 제너레이터: 12, 24, 36 세 개의 값을 순서대로 산출하는 기본 제너레이터입니다.
  2. test2() 제너레이터: 내부에서 yield* test()를 호출하여 test()의 반복 전체를 위임받습니다.
  3. iterator.next(): test2()로 생성한 이터레이터에서 next()를 호출할 때마다, 사실상 test() 내부의 yield 값인 12 → 24 → 36이 차례로 반환됩니다.

즉, yield*는 중간에 별도의 처리 없이 다른 이터레이터의 흐름을 그대로 통과시키는 위임(delegate) 역할을 합니다. 만약 yield* 대신 일반 yield를 사용했다면, test() 제너레이터 객체 자체가 하나의 값으로 반환되어 개별 숫자를 얻을 수 없었을 것입니다.