[JavaScript] ES6에서의 순회와 이터러블

2022. 5. 19. 17:01·JavaScript
반응형

1. ES6에서의 리스트 순회 

우리가 일반적으로 사용하는 리스트의 순회는 for( let i = 0; 1 < 10; i++) 방식이다. 

const list = [1, 2, 3];

for(let i = 0; i < list.length; i++) {
	console.log(list[i]);
}

 

ES6에 오면서 새로운 방식의 리스트 순회가 생겼다. 

const list = [1, 2, 3];

for(const a of list) {
	console.log(a);   
}

for of 방식으로 내부 데이터를 쉽게 조회하는 방법이 생겼다. 

 

2. 이터러블/이터레이터 프로토콜

이터러블 프로토콜은 ES6에서 도입된 것으로 순회 가능한 객체를 나타내는 프로토콜이다. 

for of 반복문, ... 전개 연산자, 구조 분해 등과 같이 함께 동작할 수 있도록한 프로토콜이다. 

 

  • 이터러블 : 이터레이터를 리턴하는 [Symbol.iterator]()를 가진 값
  • 이터레이터 : { value, done } 객체를 리턴하는 next()를 가진 값
  • 이터러블/이터레이터 프로토콜 : 이터러블을 for of, 전개 연산자 등과 함께 동작 가능하도록한 규약

배열이 for of 순회가 가능한 이유는 이터러블이기 때문이다. 

배열 내부에 Symbol(Symbol.iterator): f value()를 확인하므로, 배열은 Symbol.iterator 이라는 키값의 메서드를 가진

객체에 부합하는 것을 확인할 수 있다. 

list[Symbol.iterator] = null 을 통해 배열이 더이상 이터러블이 아니게 되므로 

for of에 사용했을 때 더이상 이터러블이 아니라는 오류를 만나게 된다. 

const list = [1, 2, 3];
const listIter = list[Symbol.iterator]();

console.log(listIter.next()); // {value: 1, done: false}
console.log(listIter.next()); // {value: 2, done: false}
console.log(listIter.next()); // {value: 3, done: false}
console.log(listIter.next()); // {value: undefined, done: true}

list[Symbol.iterator]는 이터레이터를 반환하는 함수이다. 

 

그렇기때문에 next() 메서드를 사용했을 때 { value, done } 객체가 반환되는 것을 볼 수 있다. 

이때, value에 값이 있으면 done은 false를 가지고 값이 없는 순회 불가능한 상황에는 done이 true를 가진다. 

 

3. 사용자 정의 이터러블

이터러블 프로토콜을 따라 순회 동작을 사용자가 정의할 수 있다는 점이 이터러블을 활용하는데 중요한 의미가 있다. 

const iterable = {
    [Symbol.iterator]() {
    	let i = 3;
        return {
        	next() {
            	return i === 0 ? 
                { value : undefined, done : true } 
                 : 
                { value : i--, done : false };
            },
            [Symbol.iterator]() { return this; }
        }
    }
}

let iter = iterable[Symbol.iterator]();

iter.next();

for(const a of iter) console.log(a);  // 2  1
반응형
저작자표시 비영리 변경금지 (새창열림)

'JavaScript' 카테고리의 다른 글

[JavaScript] 콜스택  (1) 2022.06.04
[JavaScript] 제너레이터와 이터레이터  (4) 2022.05.20
[JavaScript] 고차 함수 ( Higher-Order Function )  (2) 2022.05.18
[JavaScript] 함수 ( 선언 ) 형 프로그래밍  (3) 2022.05.17
[JavaScript] for문과 forEach문 차이  (0) 2022.04.25
'JavaScript' 카테고리의 다른 글
  • [JavaScript] 콜스택
  • [JavaScript] 제너레이터와 이터레이터
  • [JavaScript] 고차 함수 ( Higher-Order Function )
  • [JavaScript] 함수 ( 선언 ) 형 프로그래밍
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    타일러영어
    덤프
    영어회화
    react
    네트워크
    Node.js
    ReactNative
    typescript
    타입스크립트
    Babel
    webpack
    javascript
    CSS
    알고리즘
    식물
    바질
    리얼학습일기
    next.js
    redux
    영어독학
    네이버 부스트캠프
    리액트
    Docker
    ChatGPT
    리얼클래스
    다이소
    자바스크립트
    바질 키우기
    CCNA
    프로그래머스
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[JavaScript] ES6에서의 순회와 이터러블
상단으로

티스토리툴바