이터러블 객체란
순차적인 데이터 접근을 위한 핵심 인터페이스를 제공하며, 반복 가능한 데이터 컬렉션을 일반화 한 것으로, for...of 반복문과 같은 반복 작업에 사용될 수 있는 객체입니다. 이터러블 객체는 Symbol.iterator 메서드를 반드시 구현해야 하며, 다음 값은 next() 메서드를 가지고 있어야 제공됩니다.
이터러블의 핵심
Symbol.iterator
Symbol.iterator 메서드는 이터러블의 핵심입니다. 이 메서드는 이터러블 객체가 반복 가능한 방식으로 동작할 수 있게 해줍니다. 자바스크립트 엔진은 이 메서드를 호출하여 이터레이터 객체를 반환하며, 이터레이터의 next() 메서드를 호출하여 반복을 진행합니다.
next() 메서드
각 반복 단계에서 호출되며 아래와 같은 형태의 객체를 반환합니다.
{
next() {
// 다음 값이 있다면:
// return { value: <nextValue>, done: false };
// 더 이상 값이 없으면:
// return { done: true };
}
}
커스텀 이터러블 객체
// FibonacciIterable 객체: max에 지정한 개수만큼 피보나치 수를 생성합니다.
const FibonacciIterable = {
max: 10, // 생성할 피보나치 수의 개수
// Symbol.iterator 메서드를 구현하여 이터러블로 만듭니다.
[Symbol.iterator]() {
const max = this.max; // 현재 객체의 max 값을 캡처합니다.
let count = 0;
let a = 0, b = 1; // 초기 피보나치 값
// 이터레이터 객체 반환
return {
next() {
if (count < max) {
// 현재 값 a를 반환한 후 피보나치 수열을 갱신합니다.
const result = { done: false, value: a };
// 구조 분해 할당
[a, b] = [b, a + b];
count++;
return result;
} else {
// 지정한 개수만큼 반환한 후 반복 종료
return { done: true };
}
}
};
}
};
// for..of를 사용하여 이터러블 객체를 순회합니다.
for (let num of FibonacciIterable) {
console.log(num);
}
// 콘솔 출력 (첫 10개의 피보나치 수):
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
커스텀된 이터레이터 수동 사용
// 위에서 정의한 FibonacciIterable로부터 이터레이터를 직접 얻기
const fibIterator = FibonacciIterable[Symbol.iterator]();
console.log(fibIterator.next()); // { done: false, value: 0 }
console.log(fibIterator.next()); // { done: false, value: 1 }
console.log(fibIterator.next()); // { done: false, value: 1 }
// ...반복 호출하여 각 피보나치 값을 순차적으로 가져올 수 있습니다.
이터러블의 활용: Array.from
이터러블 객체나 유사 배열 객체는 내장 메서드 Array.from()을 사용하면 실제 배열로 변환할 수 있습니다.
유사 배열 객체
const arrayLikeObject = { 0: 'apple', 1: 'banana', length: 2 };
const realArrayFromLike = Array.from(arrayLikeObject); // 유사 배열 -> 배열 변환
console.log(realArrayFromLike); // ['apple', 'banana']
realArrayFromLike.push('orange'); // 배열 메서드 사용 가능
이터러블 객체
// 위 FibonacciIterable을 배열로 변환
const fibArray = Array.from(FibonacciIterable);
console.log(fibArray); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
// 또한, Array.from은 매핑 함수를 함께 전달하여 각 요소를 가공할 수 있습니다.
const squaredFib = Array.from(FibonacciIterable, num => num * num);
console.log(squaredFib);
// [0, 1, 1, 4, 9, 25, 64, 169, 441, 1156]
내장 이터러블 객체
배열
const arr = [10, 20, 30];
for (const value of arr) {
console.log(value);
}
문자열
각 글자를 순회합니다.
for (const char of "Iterables") {
console.log(char);
}
Map, Set
Map과 Set 역시 이터러블이므로 for...of를 사용할 수 있습니다.
const set = new Set(["apple", "banana", "cherry"]);
for (const fruit of set) {
console.log(fruit);
}
'JavaScript' 카테고리의 다른 글
[JavaScript] WeakMap 및 WeakSet 메모리 관리 (0) | 2025.02.12 |
---|---|
[JavaScript] Map과 Set (0) | 2025.02.12 |
[JavaScript] 배열 내장 메서드 (0) | 2025.02.12 |
[JavaScript] 배열(Array) (1) | 2025.02.12 |
[JavaScript] 문자열 자료형 (0) | 2025.02.12 |