34. 이터러블

Jun_Gyu·2025년 2월 14일
0

한 발자국 더, JS

목록 보기
21/34
post-thumbnail

1. 이터레이션 프로토콜

ES6에 도입된 기능으로, 순회 가능한 데이터 컬렉션(자료구조)을 만들기 위해서 ECMAScript 사양에 정의하여 미리 약속한 규칙이다.

  • ES6 이전의 순회 가능한 데이터 컬렉션(배열, 문자열, 유사 배열 객체 등)은 통일된 규약 없이 for문, for...in문, forEach 메서드 등의 방법으로 순회가 가능했음.

  • ES6에서는 순회 가능한 데이터 컬렉션을 이터레이션 프로토콜을 준수하는 이터러블로 통일하여 for...of문, 스프레드 문법, 배열 디스트럭처링 할당의 대상으로 사용할 수 있도록 일원화 함.


이터레이션 프로토콜에는 두가지 종류가 존재한다.

- 이터러블 프로토콜

  • Symbol.iterator를 프로퍼티 키로 사용한 메서드를 직접 구현하거나, 프로토타입 체인을 통해 상속받은 Symbol.iterator를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환함.
  • 이터러블 프로토콜을 준수한 객체를 이터러블이라 함.
  • 이터러블은 for...of 문으로 순회가 가능함.
  • 스프레드 문법배열 디스트럭처링 할당의 대상으로 사용 가능.

- 이터레이터 프로토콜

  • Symbol.iterator 메서드를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환.
  • 이터레이터는 next 메서드를 소유, next 메서드를 호출 시 이터러블을 순회하며 value와 done 프로퍼티를 갖는 이터레이터 리절트 객체 (iterator result object)를 반환함.
  • 이러한 규약을 이터레이터 프로토콜이라고 함.
  • 이터레이터는 이터러블의 요소를 탐색하기 위한 포인터 역할을 수행

2. 빌트인 이터러블

JS는 이터레이터 프로토콜을 준수한 객체, 빌트인 이터러블을 제공함.

빌트인 이터러블Symbol.iterator 메서드
ArrayArray.prototype[Symbol.iterator]
StringString.prototype[Symbol.iterator]
MapMap.prototype[Symbol.iterator]
SetSet.prototype[Symbol.iterator]
TypeArrayTypeArray.prototype[Symbol.iterator]
argumentsarguments[Symbol.iterator]
DOM 컬렉션NodeList.prototype[Symbol.iterator]
HTMLCollection.prototype[Symbol.iterator]

3. for...of

for...of 문은 이터러블을 순회하며 이터러블의 요소를 변수에 할당하며,
for...in의 문과 형식이 매우 유사함.

for (변수선언문 of 이터러블) { ... }
for (변수선언문 in 객체) { ... }
  • for...in 문은 객체의 프로토타입 체인 상에 존재하는 모든 프로토타입의 프로퍼티 중 프로퍼티 어트리뷰트 [[Enumerable]]의 값이 true인 프로퍼티를 순회하며 열거함.
  • 이 때, 프로퍼티 키심벌인 프로퍼티는 열거하지 않음.
  • 이터레이터 리절트 객체의 done 프로퍼티 값이 false면 이터러블 순회를 계속하고 true면 중단함.

4. 이터러블과 유사 배열 객체

유사 배열 객체는 이터러블이 아닌 일반 객체임. 하지만 Array.from메서드를 통해 배열로 변환시킬 수 있음.

  • 유사 배열 객체는 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체임.
  • length 프로퍼티를 갖기 때문에 for 문으로 순회 가능
  • 유사 배열 객체는 이터러블이 아닌 일반 객체기 때문에 for ... of 문으로 순회 불가
  • 배열, arguments, NodeList, HTMLCollection유사 배열 객체이면서 이터러블이다.
  • 유사 배열 객체를Array.from 메서드를 사용해 배열로 변환시킬 수 있음.

5. 이터레이션 프로토콜의 필요성

  • ES6에서는 순회 가능한 자료구조를 이터레이션 프로토콜을 준수하는 이터러블로 통일해 for...of 문, 스프레드 문법, 배열 디스트럭처링 할당의 대상으로 사용할 수 있도록 일원화.
  • 데이터 공급자(Array, String, Map/Set, Dom컬렉션)가 하나의 순회방식을 갖도록 규정하여 데이터 소비자(for...of문, 스프레드 문법, Map/Set 생성자)가 효율적으로 다양한 데이터 공급자를 사용할 수 있도록데이터 소비자 <=> 데이터 공급자간을 서로 연결해주는 인터페이스 역할 수행.

6. 사용자 정의 이터러블

  • 이터레이션 프로토콜을 준수하지 않는 일반객체도 이터레이션 프로토콜을 준수하도록 구현하면 사용자 정의 이터러블이 됨.
  • 사용자 정의 이터러블은 Symbol.iterator 메서드를 구현하고, Symbol.iterator 메서드가 next 메서드를 갖는 이터레이터를 반환하도록 함.

지연평가

데이터가 필요한 시점 이전까지는 미리 데이터를 생성하지 않고, 데이터가 필요한 시점에 맞춰 데이터를 생성하는 기법.

  • 불필요한 데이터를 미리 생성하지 않고, 필요한 데이터를 필요한 순간에 생성하므로 빠른 실행속도를 기대할 수 있으며, 불필요한 메모리를 소비하지도 않고, 무한도 표현할 수 있다는 장점이 있음.

따라서,

이터러블은 순차적으로 데이터를 생성하는 객체를 이야기하며,
지연 평가는 데이터 생성을 필요한 순간까지 미루는 기법임.

이터러블은 이러한 지연 평가를 통해 불필요한 데이터 생성을 피할 수 있으며, 유동적인 데이터 생성이 가능해진다.

profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글