이번에는 이터러블(iterable) 에 대해 알아보도록 하겠습니다.
iterable 을 한국어로 번역하면, 반복 가능한 이라는 뜻으로, 배열을 일반화한 객체 입니다.
따라서, 이터러블을 어떻게 만들고, 어떻게 사용하는지 지금부터 알아보도록 합시다!
1. 이터러블(iterable)
let obj = {
start: 1,
end: 4,
[Symbol.iterator]() {
return {
current: this.start,
last: this.end,
next() {
if(this.current <= this.last) {
return {
done: false,
value: this.current++
}
} else {
return {
done: true
}
}
}
}
}
}
위의 코드가 이터러블을 선언한 것입니다.
먼저, 이터러블이 동작하기 시작할 때, 가장 먼저 실행되는 코드는 객체 속의 Symbol.iterator 메소드 입니다. 따라서, Symbol.iterator 메소드를 선언해주어야 합니다.
Symbol.iterator 가 실행된 후에는, 객체를 또 반환하게 되는데, 이 객체 속에 next 라는 메소드가 존재하야 합니다. 이터러블이 다음 동작을 수행할 때, next 메소드를 호출하기 때문이죠.
마지막으로, next 메소드는 정해진 형식의 객체를 반환하야 하는데, 객체 속에 done 과 value 프로퍼티가 존재해야 합니다. done 프로퍼티는 이터러블의 동작을 끝낼지 여부를 나타내고, value 프로퍼티는 말 그대로 내보낼 값을 의미합니다.
이터러블는 이런식으로 동작합니다. 조금 복잡하고 난해할 수 있지만, 차근차근 이해해보시길 바랍니다.
let str = "Hello, World!";
for(let char of str) {
console.log(char); // H e l l o , W o r l d !
}
let iterator = str[Symnbol.iterator];
while(true) {
let result = iterator.next();
if(result.done) break;
console.log(result.value);
}
우리가 직접 만드는 이터러블 외에도, 일반적으로 선언하는 문자열도 이터러블 입니다. 따라서, for ... of 를 통해 문자열의 문자를 하나하나 가져올 수 있죠.
또한, for ... of 를 사용하는 것 대신에, 직접 Symbol.iterator 메소드를 끄집어와서 next 메소드를 호출해가면서 사용할 수도 있습니다. 위에서 str[Symbol.iterator] 를 통해 이터레이터를 직접 가져와서 while 문 안에서 next 메소드를 호출해 결과를 직접 가져오는것을 볼 수 있습니다.
2. 유사 배열(array-like)
전의 글에서 잠깐 다루었던 유사 배열(array-like) 에 대해서 알아보도록 합시다.
유사 배열(array-like) 은 이터러블과 비슷해서 혼동하기 쉽지만, 엄연히 다릅니다.
뭐...사실 대단한 다름은 아닙니다. 유사 배열은 이터러블과 달리 인덱스와 length 프로퍼티가 있어서 말 그대로 배열처럼 보이는 객체를 뜻합니다.
let obj = {
0: "Hello",
1: "World",
length: 2
}
// Symbol.iterator 가 없어서 에러 발생
for(let v of obj) {
console.log(v);
}
for(let v of Array.from(obj)) {
console.log(v); // Hello World
}
유사 배열은 이터러블과 달리, for ... of 를 사용하지 못합니다. 말 그래도 배열처럼 보이는 객체일 뿐, 진짜 배열이나 이터러블이 아니기 때문이죠.
따라서, 이러한 유사 배열을 진짜 배열처럼 사용할 수 있게 하는 메소드가 있습니다. 바로, Array.from 메소드 입니다.
Array.from 메소드에 유사 배열 뿐만 아니라, 이터러블을 포함하여 진짜 배열로 만들어줍니다. 따라서, Array.from 메소드를 통해 만들어진 배열은 일반 배열과 마찬가지로 push 나 pop 같은 기본 내장 메소드도 사용할 수 있죠.
이렇게, 이터러블과 유사 배열에 대해 간략하게 알아보았는데, 이터러블은 조금 복잡하고 이해하기 힘들 수 있지만, 한두번만 보는것이 아닌 반복적으로 복습하시면서 완벽하게 습득하셨으면 좋겠습니다.
다음 글들도 많은 관심 부탁드립니다!
'프로그래밍 > JavaScript' 카테고리의 다른 글
[JavaScript Core] 구조 분해 할당(destructuring assignment) 에 대해 알아보자 (2) | 2023.11.29 |
---|---|
[JavaScript Core] 맵(Map), 셋(Set), 위크맵(WeakMap), 위크셋(WeakSet) 에 대해 알아보자 (2) | 2023.11.24 |
[JavaScript Core] 배열의 메소드 들을 자세하게 알아보자 (2) | 2023.11.20 |
[JavaScript Core] 배열에 대해 알아보자 (2) | 2023.11.18 |
[JavaScript Core] 문자열에 대해 자세히 알아보자 (0) | 2023.11.14 |