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>
실행 결과
위 코드를 브라우저에서 실행하면 다음과 같은 초기 화면이 나타납니다.

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

동작 원리 상세 설명
- test() 제너레이터: 12, 24, 36 세 개의 값을 순서대로 산출하는 기본 제너레이터입니다.
- test2() 제너레이터: 내부에서
yield* test()를 호출하여 test()의 반복 전체를 위임받습니다. - iterator.next(): test2()로 생성한 이터레이터에서
next()를 호출할 때마다, 사실상 test() 내부의yield값인 12 → 24 → 36이 차례로 반환됩니다.
즉, yield*는 중간에 별도의 처리 없이 다른 이터레이터의 흐름을 그대로 통과시키는 위임(delegate) 역할을 합니다. 만약 yield* 대신 일반 yield를 사용했다면, test() 제너레이터 객체 자체가 하나의 값으로 반환되어 개별 숫자를 얻을 수 없었을 것입니다.