λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

λ…μ„œ λͺ©λ‘/λͺ¨λ”₯λ‹€ Modern JS Deep Dive

[λͺ¨λ”₯λ‹€] 34μž₯ μ΄ν„°λŸ¬λΈ”

728x90

🐻 34.1 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œ

 

iteration: 반볡, 순회

protocol: 약속, 규격

=> μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ λ”°λ₯Έλ‹€λŠ” 것은 μˆœνšŒκ°€ κ°€λŠ₯ν•˜λ‹€ 라고도 말할 수 μžˆλ‹€.

=> μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λŠ” κ°μ²΄λŠ” for...of λ‚˜ spread μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

μ–΄λ–€ 객체든지 μˆœνšŒκ°€ κ°€λŠ₯ν•œ 객체가 되기 μœ„ν•΄μ„œλŠ” iterable ν”„λ‘œν† μ½œμ„ λ”°λΌμ•Όν•œλ‹€.

[Symbol.iterator](): Iterator ν”„λ‘œν† μ½œ

-> 이 ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄? μˆœνšŒκ°€ κ°€λŠ₯ν•œ μ˜€λΈŒμ νŠΈκ°€ λœλ‹€.

-> 그리고 이 ν•¨μˆ˜ μ•ˆμ—μ„œ Iterator ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λŠ”, 즉 μˆœνšŒν•˜λŠ” 반볡자λ₯Ό λ¦¬ν„΄ν•˜λŠ” 객체λ₯Ό λ§Œλ“€λ©΄ λœλ‹€.

 

 

πŸ“Œ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œ 

순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜μ„ λ§Œλ“€κΈ° μœ„ν•΄ ECMAScript  사양에 μ •μ˜ν•˜μ—¬ 미리 μ•½μ†ν•œ κ·œμΉ™. 

- μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œ

: μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체

: for...of 문으둜 μˆœνšŒν•  수 있으며 μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ λŒ€μƒμœΌλ‘œ μ‚¬μš©λ  수 μžˆλ‹€.

- μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œ 

: Symbol.iterator λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜.

: μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯Ό μ΄ν„°λ ˆμ΄ν„°λΌκ³  ν•œλ‹€. -> μ΄ν„°λŸ¬λΈ”μ˜ μš”μ†Œλ₯Ό νƒμƒ‰ν•˜κΈ° μœ„ν•œ 포인터 역할을 ν•œλ‹€.

 

 

34.1 μ΄ν„°λŸ¬λΈ”

Symbol.iterator λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜κ±°λ‚˜ ν”„λ‘œν† νƒ€μž… 체인을 톡해 상속받은 객체λ₯Ό λ§ν•œλ‹€.

- Map, Set, λ°°μ—΄, λ¬Έμžμ—΄ 등은 μ΄ν„°λŸ¬λΈ”μ΄λ‹€.

 

일반 κ°μ²΄λŠ” for...of 문으둜 μˆœνšŒν•  수 μ—†λ‹€.

ν•˜μ§€λ§Œ μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄ μ΄ν„°λŸ¬λΈ”μ΄ 될 수 μžˆλ‹€.

 

34.2 μ΄ν„°λ ˆμ΄ν„°

Symbol.iterator λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ -> μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•¨.

μ΄λ ‡κ²Œ λ°˜ν™˜λœ μ΄ν„°λ ˆμ΄ν„°λŠ” next λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.

next λ©”μ„œλ“œλŠ” μ΄ν„°λŸ¬λΈ”μ˜ 각 μš”μ†Œλ₯Ό μˆœνšŒν•˜κΈ° μœ„ν•œ ν¬μΈν„°μ˜ 역할을 ν•œλ‹€.

-> 순차적으둜 ν•œλ‹¨κ³„μ”© μˆœνšŒν•˜λ©°, 순회 κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

 

 

 

 

 

🐻 34.2 빌트인 μ΄ν„°λŸ¬λΈ”

 

JS λŠ” μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체인 빌트인 μ–΄ν„°λŸ¬λΈ”μ„ 제곡. 

- Array

- String

- Map

- Set

- TypedArray

- arguments

- DOM μ»¬λ ‰μ…˜

 

 

 

 

 

🐻 34.3 for...of 문

 

for...of 문은 μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ˜ μš”μ†Œλ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€.

for(λ³€μˆ˜μ„ μ–Έλ¬Έ of μ΄ν„°λŸ¬λΈ”) {...}

μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. 

λ‚΄λΆ€μ μœΌλ‘œ μ΄ν„°λ ˆμ΄ν„°μ˜ next λ©”μ„œλ“œλ₯Ό 호좜 -> 순회 -> 리절트 객체의 value 값을 λ³€μˆ˜μ— 할당함. 

리적트 객체의 done ν”„λ‘œνΌν‹° 값이 false λ©΄ 순회 계속, true λ©΄ 순회 쀑단.

 

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

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

πŸ‘‡κ²°κ³Ό

{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: undefined, done: true }

 

 

for...in κ³Ό 맀우 μœ μ‚¬ν•˜λ‹€. (<- [[Enumerable]] 이 true 인 ν”„λ‘œνΌν‹°λ₯Ό μˆœνšŒν•˜λ©° μ—΄κ±°ν•œλ‹€.

 

 

 

 

 

🐻 34.4 μ΄ν„°λŸ¬λΈ”κ³Ό μœ μ‚¬ λ°°μ—΄ 객체

 

μœ μ‚¬ λ°°μ—΄ 객체

- λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 있음 

- length ν”„λ‘œν„°ν”Όλ₯Ό κ°–λŠ”λ‹€.

-> for 문으둜 순회 κ°€λŠ₯

- ν•˜μ§€λ§Œ μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 κ°μ²΄μž„. 

-> Symbol.iterator λ©”μ„œλ“œκ°€ μ—†μŒ. 

-> for...of 문으둜 μˆœνšŒλŠ” λΆˆκ°€λŠ₯

 

Array.from

μœ μ‚¬ λ°°μ—΄ 객체 λ˜λŠ” μ΄ν„°λŸ¬λΈ”μ„ 인수둜 전달받아 λ°°μ—΄λ‘œ λ³€ν™˜ & λ°˜ν™˜

 

 

 

 

 

🐻 34.5 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ˜ ν•„μš”μ„±

 

μ΄ν„°λŸ¬λΈ”μ€ 데이터 κ³΅κΈ‰μžμ˜ μ—­ν• . 

μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œ

: κ³΅κΈ‰μžκ°€ ν•˜λ‚˜μ˜ μˆœν™˜ 방식을 갖도둝 κ·œμ • -> 데이터 μ†ŒλΉ„μžκ°€ 효율적으둜 μ‚¬μš©ν•  수 있게 μ—°κ²°ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.

 

 

 

// 보좩 ν•„μš”

🐻 34.6 μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”

 

34.6.1 μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ” κ΅¬ν˜„

- 일반 객체도 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄ μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”μ΄ λœλ‹€. 

Symbol.iterator λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ³  이 λ©”μ„œλ“œκ°€ next λ©”μ„œλ“œλ₯Ό κ°–λŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•œλ‹€.

 

 

34.6.2 μ΄ν„°λŸ¬λΈ”μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜

 

 

34.6.3 μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°μΈ 객체λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜

 

 

34.6.4 λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”κ³Ό 지연 평가

 

지연 평가

: 데이터가 ν•„μš”ν•œ μ‹œμ  μ΄μ „κΉŒμ§€λŠ” 미리 데이터λ₯Ό μƒμ„±ν•˜μ§€ μ•Šλ‹€κ°€ 데이터가 ν•„μš”ν•œ μ‹œμ μ΄ 였면 κ·Έλ•Œμ•Ό λΉ„λ‘œμ†Œ 데이터λ₯Ό μƒμ„±ν•˜λŠ” 기법

: λΆˆν•„μš”ν•œ 데이터λ₯Ό 미리 μƒμ„±ν•˜μ§€ μ•Šμ•„ λΉ λ₯Έ μ‹€ν–‰ 속도λ₯Ό κΈ°λŒ€ν•  수 있고, λ¬΄ν•œλ„ ν‘œν˜„μ΄ κ°€λŠ₯. 

next λ©”μ„œλ“œκ°€ 호좜될 λ•Œ 데이터가 생성됨. 

728x90
λ°˜μ‘ν˜•