관리 메뉴

Daehyunii's Dev-blog

34μž₯ μ΄ν„°λŸ¬λΈ” λ³Έλ¬Έ

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

  ES6μ—μ„œ λ„μž…λœ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ€ 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜ 즉 자료ꡬ쑰λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ ECMAscript 사양에 μ •μ˜ν•˜μ—¬ 미리 μ•½μ†ν•œ κ·œμΉ™μ΄λ‹€. ES6 μ΄μ „μ˜ 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜, 즉 λ°°μ—΄, λ¬Έμžμ—΄, μœ μ‚¬ λ°°μ—΄ 객체, DOM μ»¬λ ‰μ…˜ 등은 ν†΅μΌλœ κ·œμ•½ 없이 각자 λ‚˜λ¦„μ˜ ꡬ쑰λ₯Ό 가지고 forλ¬Έ, for...inλ¬Έ, forEach λ©”μ„œλ“œ λ“± λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μˆœνšŒν•  수 μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ μ΄μ œλŠ” 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜μ„ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” μ΄ν„°λŸ¬λΈ”λ‘œ ν†΅μΌν•˜μ—¬ for...of λ¬Έ, μŠ€ν”„λ ˆλ“œ 문법, λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μΌμ›ν™”ν–ˆλ‹€. μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ—λŠ” μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œκ³Ό μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ΄ μžˆλ‹€. 

 

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

  μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯Ό μ΄ν„°λŸ¬λΈ”μ΄λΌ ν•œλ‹€. 즉 μ΄ν„°λŸ¬λΈ”μ€ Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‚€ ν‚€λ‘œ μ‚¬μš©ν•œ λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜κ±°λ‚˜ ν”„λ‘œν† νƒ€μž… 체인을 톡해 상속받은 객체λ₯Ό λ§ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 배열은 Array.prototype의 Symbol.iterator λ©”μ„œλ“œλ₯Ό 상속받은 μ΄ν„°λŸ¬λΈ”μ΄λ‹€. μ΄ν„°λŸ¬λΈ”μ€ for...of λ¬Έ, μŠ€ν”„λ ˆλ“œ 문법, λ°°μ—΄ λ“œμŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

  Symbol.iterator λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜μ§€ μ•Šκ±°λ‚˜ 상속받지 μ•Šμ€ 일반 κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹ˆλ‹€. λ”°λΌμ„œ 일반 κ°μ²΄λŠ” for...of 문으둜 μˆœνšŒν•  수 μ—†μœΌλ©° μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€. ν•˜μ§€λ§Œ μ΄ν„°λŸ¬λΈ” 일반 객체도 μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄ μ΄ν„°λŸ¬λΈ”μ΄ λœλ‹€.

 

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

  μ΄ν„°λŸ¬λΈ”μ˜ Symbol.iterator λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•œλ‹€. μ΄ν„°λŸ¬λΈ”μ˜ Symbol.iterator λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•œ μ΄ν„°λ ˆμ΄ν„°λŠ” next λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€. μ΄ν„°λ ˆμ΄ν„°μ˜ next λ©”μ„œλ“œλŠ” μ΄ν„°λŸ¬λΈ”μ˜ 각 μš”μ†Œλ₯Ό μˆœνšŒν•˜κΈ° μœ„ν•œ ν¬μΈν„°μ˜ 역할을 ν•œλ‹€. 즉, next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λŸ¬λΈ”μ„ 순차적으둜 ν•œ 단계씩 μˆœνšŒν•˜λ©° 순회 κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ΄ν„°λ ˆμ΄ν„° 리젝트 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

const array = [1,2,3];

const iterator = array[Symbol.iterator]();

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

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

  μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체인 빌트인 μ΄ν„°λŸ¬λΈ”μ„ μ œκ³΅ν•œλ‹€. 

빌트인 μ΄ν„°λŸ¬λΈ” Symbol.iterator λ©”μ„œλ“œ
Array Array.prototype[Symbol.iterator]
String String.prototype[Symbol.iterator]
Map Map.prototype[Symbol.iterator]
Set Set.prototype[Symbol.iterator]
TypedArray TypedArray.prototype[Symbol.iterator]
arguments arguments[Symbol.iterator]
DOM μ»¬λ ‰μ…˜ NodeList.prototype[Symbol.iterator] HTMLCollection.prototype[Symbol.iterator]

34.3 for...of λ¬Έ

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

for...in 문은 객체의 ν”„λ‘œν† νƒ€μž… 체인 상에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œνΌν‹° μ€‘μ—μ„œ ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈ [[Enumerable]]의 값이 true인 ν”„λ‘œνΌν‹°λ₯Ό μˆœνšŒν•˜λ©° μ—΄κ±°ν•œλ‹€. μ΄λ•Œ ν”„λ‘œνΌν‹° ν‚€κ°€ μ‹¬λ²ŒμΈ ν”„λ‘œνΌν‹°λŠ” μ—΄κ±°ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

  for...of 문은 λ‚΄λΆ€μ μœΌλ‘œ μ΄ν„°λ ˆμ΄ν„°μ˜ next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©° next λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•œ μ΄ν„°λ ˆμ΄ν„° 리절트 객체의 value ν”„λ‘œνΌν‹° 값을 for...of 문의 λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€. 그리고 μ΄ν„°λ ˆμ΄ν„° 리절트 객체의 done ν”„λ‘œνΌν‹° 값이 false이면 μ΄ν„°λŸ¬λΈ”μ˜ 순회λ₯Ό κ³„μ†ν•˜κ³  ture이면 μ΄ν„°λŸ¬λΈ”μ˜ 순회λ₯Ό μ€‘λ‹¨ν•œλ‹€.

for(const item of [1,2,3]){
    console.log(item); // 1 2 3
}

 

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

  μœ μ‚¬ λ°°μ—΄ κ°μ²΄λŠ” 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 있고 length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό λ§ν•œλ‹€. μœ μ‚¬ λ°°μ—΄ κ°μ²΄λŠ” length ν”„λ‘œνΌν‹°λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— for 문으둜 μˆœνšŒν•  수 있고, 인덱슀λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 숫자 ν˜•μ‹μ˜ λ¬Έμžμ—΄μ„ ν”„λ‘œνΌν‹° ν‚€λ‘œ κ°€μ§€λ―€λ‘œ 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 μžˆλ‹€. μœ μ‚¬ λ°°μ—΄ κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 객체닀. λ”°λΌμ„œ μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ—λŠ” Symbol.iterator λ©”μ„œλ“œκ°€ μ—†κΈ° λ•Œλ¬Έμ— for...of 문으둜 μˆœνšŒν•  수 μ—†λ‹€. 단, arguments, NodeList, HTMLCollection은 μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.