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

I. 이터러블 프로토콜 iterable protocol

  • 반복, 순회 기능을 사용하는 주체간의 통일된 규격
  • 공통 기능들: for ... of, 스프레드 문법, 배열 디스트럭쳐링
  • 👉 MDN 문서 보기


이터러블 iterable - 이터러블 프로토콜을 준수하는 객체

console.log( [][Symbol.iterator], ''[Symbol.iterator], new Set()[Symbol.iterator], new Map()[Symbol.iterator] ); // 다른 타입의 인스턴스에는 없음 console.log( (1)[Symbol.iterator], (true)[Symbol.iterator], { x: 1 }[Symbol.iterator] );

실행시 이터레이터 반환

console.log( [][Symbol.iterator](), ''[Symbol.iterator](), new Set()[Symbol.iterator](), new Map()[Symbol.iterator]() );



II. 이터레이터 iterator

  • next 메서드를 통해 이터러블을 순회하며 값을 반환
const arr = [1, 'A', true, null, {x: 1, y: 2 }]; const arrIterator = arr[Symbol.iterator](); // 펼쳐서 메서드 살펴볼 것 console.log(arrIterator); console.log( arrIterator.next ); arrIterator.next(); // ⭐ 반복 실행해 볼 것

이터레이터 프로토콜 iterator protocol

next 메서드의 반환 객체 내 요소

  • value - 해당 차례에 반환할 값
  • done - 순회 종료 여부 ( 마지막 값 반환 다음 차례부터 )




III. 이터러블 만들어보기

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

const diceTenTimes = { // ⭐️ 아래의 메서드를 갖는 것이 이터러블 프로토콜 [Symbol.iterator] () { let count = 0; let maxCount = 10; // ⭐️ 이터레이터(next 메서드를 가진 객체)을 반환 return { next () { return { value: Math.ceil(Math.random() * 6), done: count++ >= maxCount } } } } } const diceIterator = diceTenTimes[Symbol.iterator](); for (let i = 0; i < 12; i++) { console.log( diceIterator.next() ); } // 💡 for ... of 문 사용 가능 for (const num of diceTenTimes) { console.log(num); } // 💡 스프레드 문법 사용 가능 const diceResults = [...diceTenTimes]; console.log(diceResults); // 💡 배열 디스트럭쳐링 사용 가능 const [first, second, ...rest] = diceTenTimes; console.log( '주사위의 첫번째, 두번째 숫자는 각각 ' + `${first}(와)과 ${second}, 나머지의 합은 ${ rest.reduce((a, b) => a + b) } 입니다.` );


예제 2. 🧮 피보나치 이터러블

function fiboIterator () { let count = 0; const maxCount = 10; // 최대 횟수가 지정됨 let [x, y] = [0, 1]; return { next () { [x, y] = [y, x + y]; return { value: y, done: count++ >= maxCount } } } } const fibonacci = { [Symbol.iterator]: fiboIterator } for (num of fibonacci) { console.log(num); }

⭐️ 원하는 최대 횟수의 피보나치 이터러블 생성하기

function getFiboWithMax (maxCount) { return { [Symbol.iterator] () { let count = 0; let [x, y] = [0, 1]; return { next () { [x, y] = [y, x + y]; return { value: y, done: count++ >= maxCount } } } } } } const fiboMax5 = getFiboWithMax(5); const fiboMax20 = getFiboWithMax(20); console.log([...fiboMax5]); console.log([...fiboMax20]);


예제 3. ⌛️ 순번 이터러블 X 이터레이터

💡 이터러블의 역할도 하는 이터레이터 만들기

function workersIter (people) { let idx = 0; return { // 💡 이터레이터로서 [스스로]를 반환! // 사장: 직원은 나다. [Symbol.iterator] () { return this; }, // 직원의 역할 next () { return { value: people[Math.min(idx, people.length - 1)], done: idx++ >= people.length }; } } } // 이터러블로 사용 // 인원 명단 확인 const team1 = [ '철수', '영희', '돌준', '미나', '준희' ]; let workersIter1 = workersIter(team1); console.log( [...workersIter1] ); // ⚠️ 이터레이터를 겸하는 경우 한 번 순회하면 끝 console.log( [...workersIter1] ); // 새로 생성해야 다시 순회 workersIter1 = workersIter(team1); console.log( [...workersIter1] ); // 이터레이터로 사용 // 인원 순번 넘기기 function switchWorker(iter) { const next = iter.next(); console.log( next.done ? '-- 인원 없음 -- ' : `${next.value} 차례입니다.` ); } workersIter1 = workersIter(team1); switchWorker(workersIter1); // ⭐ 반복 실행해 볼 것

⭐ 다음 강의 제너레이터로 보다 간편하게 구현

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

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

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

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

🛑질문 전 필독!!

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