home강의 홈으로
Section 10. 이터러블과 제너레이터
Lesson 4. 제너레이터

제너레이터 generator

function* genFunction () { console.log('하나를 반환합니다.'); yield '하나'; console.log('둘을 반환합니다.'); yield '둘'; console.log('셋을 반환합니다.'); yield '셋'; } const genFunc = genFunction(); // 반복 수행해 볼 것 // 💡 아래의 코드가 블록의 코드에 대한 제어권을 가짐 console.log( genFunc.next() );
  • 함수 내 코드들을 모두 실행하지 않고 외부 호출자에게 제어권을 양도 - "계속할까요?"
  • 이터러블과 이터레이터를 보다 간결하게 구현 가능
  • 👉 MDN 문서 보기


I. 기본 사용법

1. 제너레이터 함수/메서드 선언

  • function 다음 또는 메서드명 앞에 * - 띄어쓰기 위치 무관
// 함수 선언 function* genFunc1 () { yield 'genFunc1'; } // 값으로 대입 const genFunc2 = function* () { yield 'genFunc2'; } // 객체의 메서드 const obj = { * genFunc3 () { yield 'genFunc3'; } } // 클래스의 메서드 class MyClass { * genFunc4 () { yield 'genFunc4'; } } // 테스트 console.log( genFunc1().next().value, genFunc2().next().value, obj.genFunc3().next().value, new MyClass().genFunc4().next().value, );


2. 제너레이터 객체

  • 제너레이터 함수의 결과값으로 반환
  • ⭐ 이터레이터이자 이터러블
function* genFunction () { yield 1; yield 2; yield 3; yield 4; yield 5; } let genObj = genFunction(); // 로그 펼쳐서 살펴볼 것 console.log( genObj ); // 💡 이터러블임 확인 console.log( genObj[Symbol.iterator] ); console.log([...genObj]); // ⚠️ 순회 후에는 재생성 필요 console.log([...genObj]); // 이터러블로서는 바로 호출이 적합 console.log([...genFunction()]); for (const num of genFunction()) { console.log(num); } genObj = genFunction(); // 재생성 // 💡 이터레이터임 확인 console.log( genObj.next ); for (let i = 0; i < 7; i++) { console.log(genObj.next()); }
  • next 메서드를 실행하면 다음 yield까지 실행 후 중지
  • yield의 값을 value로 반환
  • 끝까지 실행 후 done: true




II. 이터러블과 이터레이터 대체하기

예제 1. 🎲 주사위를 열 번 굴리는 제너레이터

function* diceTenTimes () { let count = 0; const maxCount = 10; while (count++ < maxCount) { yield Math.ceil(Math.random() * 6); } } // 이터러블 console.log( [...diceTenTimes()] ); // 이터레이터 - 객체로 반환 뒤 사용 // ⚠️ 다시 순회시 재생성 필요 let diceGenObj = diceTenTimes(); for (let i = 0; i < 12; i++) { console.log(diceGenObj.next()); }


예제 2. 🧮 피보나치 제너레이터

function* fibonacci (maxCount) { let count = 0; let [x, y] = [0, 1]; while (count++ < maxCount) { [x, y] = [y, x + y]; yield y; } } console.log( [...fibonacci(10)] ); let fiboGenObj = fibonacci(5); for (let i = 0; i < 7; i++) { console.log( fiboGenObj.next() ); }


예제 3. ⌛️ 순번 제너레이터

function* workersGen (people) { let idx = 0; while (idx < people.length) { yield people[idx++]; } } const team1 = [ '철수', '영희', '돌준', '미나', '준희' ]; console.log( [...workersGen(team1)] ); // 이터레이터로 사용 // 인원 순번 넘기기 function switchWorker(iter) { const next = iter.next(); console.log( next.done ? '-- 인원 없음 -- ' : `${next.value} 차례입니다.` ); } workersIter1 = workersGen(team1); switchWorker(workersIter1); switchWorker(workersIter1); switchWorker(workersIter1); switchWorker(workersIter1); switchWorker(workersIter1); switchWorker(workersIter1); switchWorker(workersIter1);

🤔얄코에게 질문하기질문은 반.드.시 이리로 보내주세요! ( 강의사이트 질문기능 ✖ )

강의에서 이해가 안 되거나 실습상 문제가 있는 부분,
설명이 잘못되었거나 미흡한 부분을 메일로 알려주세요!

답변드린 뒤 필요할 경우 본 페이지에
관련 내용을 추가/수정하도록 하겠습니다.

이메일 주소
yalco@yalco.kr
메일 제목 (반드시 아래 제목을 붙여넣어주세요!)
[질문] 제대로 파는 자바스크립트 (유료 파트) 10-4

🛑질문 전 필독!!

  • 구글링을 먼저 해 주세요. 들어오는 질문의 절반 이상은 구글에 검색해 보면 1분 이내로 답을 찾을 수 있는 내용들입니다.
  • 오류 메시지가 있을 경우 이를 구글에 복붙해서 검색해보면 대부분 짧은 시간 내 해결방법을 찾을 수 있습니다.
  • 강의 페이지에 추가사항 등 놓친 부분이 없는지 확인해주세요. 자주 들어오는 질문은 페이지에 추가사항으로 업데이트됩니다.
  • "유료파트의 강의페이지는 어디 있나요?" - 각 영상의 시작부분 검은 화면마다 해당 챕터의 강의페이지 링크가 있습니다.
  • 질문을 보내주실 때는 문제가 어떻게 발생했고 어떤 상황인지 등을 구체적으로 적어주세요. 스크린샷을 첨부해주시면 더욱 좋습니다.
🌏 Why not change the world?