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

Work/Web

[μžλ°”μŠ€ν¬λ¦½νŠΈ] λ…Έλ‹΅ λ””μžμ΄λ„ˆμ˜ μ½”λ”© 배우기 - arguments 객체

1-1. arguments κ°μ²΄λŠ” 뭐고, μ™œ μ‚¬μš©ν•˜λŠ” κ±°μ§€?


 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ arguments 객체와 κ΄€λ ¨λœ κ°œλ…μ€ ν•¨μˆ˜μ˜ 인자 관리에 맀우 μœ μš©ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.

 

arguments κ°μ²΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ¨λ“  ν•¨μˆ˜ λ‚΄μ—μ„œ μžλ™μœΌλ‘œ μƒμ„±λ˜λŠ” νŠΉλ³„ν•œ κ°μ²΄μž…λ‹ˆλ‹€. 이 κ°μ²΄λŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œ μ „λ‹¬λœ **λͺ¨λ“  인자(Arguments)**λ₯Ό λ°°μ—΄κ³Ό μœ μ‚¬ν•œ ν˜•νƒœλ‘œ λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

νŠΉμ§•:

λ°°μ—΄μ²˜λŸΌ μƒκ²Όμ§€λ§Œ 배열이 μ•„λ‹˜. 즉, λ°°μ—΄ λ©”μ„œλ“œ(map, filter, forEach λ“±)λ₯Ό μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, 인덱슀둜 μ ‘κ·Όν•˜κ³ , length ν”„λ‘œνΌν‹°λ‘œ 인자의 개수λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ μ„ μ–Έμ—μ„œ μ •μ˜ν•œ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ 상관없이 μ „λ‹¬λœ λͺ¨λ“  인자λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜κ°€ λͺ‡ 개의 인자λ₯Ό 받을지 μ•Œ 수 없을 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

 

μ™œ μ‚¬μš©ν•˜λŠ”κ°€?

μœ μ—°ν•œ ν•¨μˆ˜ κ΅¬ν˜„: ν•¨μˆ˜κ°€ λͺ‡ 개의 인자λ₯Ό 받을지 미리 μ•Œ 수 μ—†κ±°λ‚˜, νŠΉμ • 개수 μ΄μƒμ˜ 인자λ₯Ό 받을 λ•Œ λͺ¨λ‘ μ²˜λ¦¬ν•˜κ³  싢을 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

λ§€κ°œλ³€μˆ˜λ³΄λ‹€ 더 λ§Žμ€ 인자λ₯Ό μ „λ‹¬ν–ˆμ„ λ•Œλ„ λͺ¨λ‘ μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ—, μ—¬λŸ¬ 개의 인자λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜μ—μ„œ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.

 

μ˜ˆμ‹œ:

function printArguments() {
  console.log(arguments); // λͺ¨λ“  μ „λ‹¬λœ 인자λ₯Ό λ‹΄κ³  μžˆλŠ” 객체
  console.log(arguments[0]); // 첫 번째 인자
  console.log(arguments[1]); // 두 번째 인자
  console.log(arguments.length); // μ „λ‹¬λœ 인자의 개수
  console.log('————');
}

printArguments('Young', 'Mark', 'Koby');
printArguments('Captain');

 

κ²°κ³Ό:

['Young', 'Mark', 'Koby']
Young
Mark
3
————
['Captain']
Captain
undefined
1
————

 

1-2. 'λ§€κ°œλ³€μˆ˜λ³΄λ‹€ 더 λ§Žμ€ 인자λ₯Ό μ „λ‹¬ν–ˆμ„ λ•Œλ„ λͺ¨λ‘ μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ—, μ—¬λŸ¬ 개의 인자λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜μ—μ„œ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.' 라고 ν–ˆμž–μ•„?  무슨 μ†Œλ¦¬μΈμ§€ λͺ¨λ₯΄κ² μ–΄!


 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜κ°€ μ •ν•΄μ§„ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ³΄λ‹€ 더 λ§Žμ€ 인자λ₯Ό 전달받을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ ν•¨μˆ˜ μ„ μ–Έμ—μ„œ λͺ…μ‹œλœ λ§€κ°œλ³€μˆ˜ 외에 μΆ”κ°€λ‘œ μ „λ‹¬λœ μΈμžλŠ” arguments 객체λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆμ–΄μš”.

 

예λ₯Ό λ“€μ–΄, ν•¨μˆ˜κ°€ μ„Έ 개의 λ§€κ°œλ³€μˆ˜λ₯Ό 받도둝 μ„ μ–Έλ˜μ—ˆλŠ”λ°, λ„€ 개의 인자λ₯Ό μ „λ‹¬ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? ν•¨μˆ˜λŠ” arguments 객체λ₯Ό μ‚¬μš©ν•΄ μΆ”κ°€λ‘œ μ „λ‹¬λœ μΈμžμ—λ„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function printArguments(a, b, c) {
  console.log(a);         // 첫 번째 인자
  console.log(b);         // 두 번째 인자
  console.log(c);         // μ„Έ 번째 인자
  console.log(arguments); // μ „λ‹¬λœ λͺ¨λ“  인자
  console.log('————');
}

printArguments('apple', 'banana', 'cherry', 'date');

 

κ²°κ³Ό:

apple   // 첫 번째 인자 a
banana  // 두 번째 인자 b
cherry  // μ„Έ 번째 인자 c
['apple', 'banana', 'cherry', 'date']  // μ „λ‹¬λœ λͺ¨λ“  인자 (arguments 객체)
————

 

이 μ½”λ“œλ₯Ό 보면, ν•¨μˆ˜λŠ” **a, b, c**λΌλŠ” μ„Έ 개의 λ§€κ°œλ³€μˆ˜λ₯Ό μ •μ˜ν–ˆμ§€λ§Œ, μ‹€μ œλ‘œλŠ” λ„€ 개의 인자('apple', 'banana', 'cherry', 'date')λ₯Ό μ „λ‹¬ν–ˆμ–΄μš”.

 

ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ **a, b, c**만 μ ‘κ·Ό κ°€λŠ₯ν•˜μ§€λ§Œ, arguments 객체λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  인자λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ arguments κ°μ²΄λŠ” λ§€κ°œλ³€μˆ˜ 외에 μΆ”κ°€λ‘œ μ „λ‹¬λœ μΈμžλ“€μ„ μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•΄μš”. 이 μƒν™©μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μΆ”κ°€ 인자λ₯Ό λ¬΄μ‹œν•˜μ§€ μ•Šκ³  arguments둜 μ €μž₯ν•΄ μ€λ‹ˆλ‹€.

 

더 μœ μ—°ν•œ ν•¨μˆ˜ λ§Œλ“€κΈ° μ˜ˆμ‹œ:

function sum() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i]; // μ „λ‹¬λœ λͺ¨λ“  인자λ₯Ό λ”ν•˜κΈ°
  }
  return total;
}

console.log(sum(1, 2, 3));           // 6
console.log(sum(1, 2, 3, 4, 5, 6));  // 21

 

이 ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šκ³ , μ „λ‹¬λœ λͺ¨λ“  인자λ₯Ό arguments 객체λ₯Ό 톡해 ν•©μ‚°ν•˜κ³  μžˆμ–΄μš”. λͺ‡ 개의 μΈμžκ°€ μ „λ‹¬λ˜λ“  상관없이 λͺ¨λ“  인자λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 방식은 μœ μ—°ν•˜κ²Œ 인자의 κ°œμˆ˜μ— 관계없이 λ™μž‘ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 있게 ν•΄μ€λ‹ˆλ‹€.

 

 

2. λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†λŠ” μœ μ‚¬λ°°μ—΄μ΄ 무슨 μ†Œλ¦¬μ•Ό?


 

arguments κ°μ²΄λŠ” **λ°°μ—΄μ²˜λŸΌ μƒκ²Όμ§€λ§Œ 배열이 μ•„λ‹Œ “μœ μ‚¬ λ°°μ—΄ 객체”**라고 λΆ€λ¦…λ‹ˆλ‹€. 이 말의 μ˜λ―ΈλŠ” 인덱슀(예: arguments[0], arguments[1] λ“±)와 length 속성을 κ°€μ§€κ³  있기 λ•Œλ¬Έμ— λ°°μ—΄μ²˜λŸΌ 인자λ₯Ό 관리할 수 μžˆμ§€λ§Œ, μ‹€μ œ 배열이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— λ°°μ—΄μ˜ λ©”μ„œλ“œ(map, filter, forEach, slice λ“±)λŠ” μ‚¬μš©ν•  수 μ—†λ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

μœ μ‚¬ λ°°μ—΄ μ˜ˆμ‹œ:

function example() {
  console.log(Array.isArray(arguments)); // false
}

example('a', 'b', 'c'); // κ²°κ³Ό: false

ν•˜μ§€λ§Œ λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λ©΄ λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. **Array.from()**μ΄λ‚˜ **spread μ—°μ‚°μž (...)**λ₯Ό μ΄μš©ν•΄ argumentsλ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

Array.from을 μ‚¬μš©ν•œ μ˜ˆμ‹œ:

function example() {
  let argsArray = Array.from(arguments);
  console.log(argsArray.map(arg => arg.toUpperCase())); // ['A', 'B', 'C']
}

example('a', 'b', 'c');

 

spread μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ μ˜ˆμ‹œ:

function example() {
  let argsArray = [...arguments];
  console.log(argsArray.map(arg => arg.toUpperCase())); // ['A', 'B', 'C']
}

example('a', 'b', 'c');

 

3. 이 ν•¨μˆ˜  { for (const arg of argments) { console.log(arg); } 의 λ©”μ†Œλ“œλ„ 이해가 κ°€μ§€ μ•Šμ•„.


 

for (const arg of arguments) {
  console.log(arg);
}

이 μ½”λ“œμ—μ„œλŠ” for...of λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ arguments 객체 μ•ˆμ— λ“€μ–΄μžˆλŠ” 각각의 인자λ₯Ό μˆœνšŒν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

for...of 반볡문의 의미:

for...ofλŠ” 반볡 κ°€λŠ₯ν•œ(iterable) κ°μ²΄μ—μ„œ 각 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© κΊΌλ‚΄μ˜€λŠ” λ°˜λ³΅λ¬Έμž…λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°°μ—΄, λ¬Έμžμ—΄, μœ μ‚¬ λ°°μ—΄ 객체 등은 반볡 κ°€λŠ₯ν•œ 객체둜 κ°„μ£Όλ©λ‹ˆλ‹€.

arguments 객체도 반볡 κ°€λŠ₯ν•œ 객체 쀑 ν•˜λ‚˜μ΄κΈ° λ•Œλ¬Έμ— **for...of**λ₯Ό μ‚¬μš©ν•΄ κ·Έ μ•ˆμ˜ μΈμžλ“€μ„ ν•˜λ‚˜μ”© κΊΌλ‚΄μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

이 μ½”λ“œλŠ” 무엇을 ν•˜λ‚˜μš”?

for (const arg of arguments)λŠ” arguments에 λ‹΄κΈ΄ μΈμžλ“€μ„ ν•˜λ‚˜μ”© μˆœνšŒν•©λ‹ˆλ‹€.

각 μˆœνšŒμ—μ„œ arg λ³€μˆ˜μ— ν˜„μž¬ μΈμžκ°€ ν• λ‹Ήλ˜κ³ , **console.log(arg)**둜 ν•΄λ‹Ή μΈμžκ°€ 좜λ ₯λ©λ‹ˆλ‹€.

 

μ˜ˆμ‹œ:

function printArguments() {
  for (const arg of arguments) {
    console.log(arg); // μ „λ‹¬λœ 인자λ₯Ό ν•˜λ‚˜μ”© 좜λ ₯
  }
  console.log('————');
}

printArguments('Young', 'Mark', 'Koby');
printArguments('Captain');
printArguments('Suri', 'Jack', 'Joy', 'Noel');

 

κ²°κ³Ό:

Young
Mark
Koby
————
Captain
————
Suri
Jack
Joy
Noel
————

 

μš”μ•½:

1. arguments κ°μ²΄λŠ” ν•¨μˆ˜μ— μ „λ‹¬λœ λͺ¨λ“  인자λ₯Ό λ°°μ—΄κ³Ό μœ μ‚¬ν•œ ν˜•νƒœλ‘œ μ €μž₯ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. λ°°μ—΄μ²˜λŸΌ 인덱슀둜 μ ‘κ·Όν•  수 μžˆμ§€λ§Œ λ°°μ—΄μ˜ λ©”μ„œλ“œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

2. μœ μ‚¬ λ°°μ—΄μ΄λž€ λ°°μ—΄μ²˜λŸΌ μƒκ²Όμ§€λ§Œ 배열이 μ•„λ‹Œ 객체λ₯Ό λ§ν•˜λ©°, λ°°μ—΄μ˜ λ©”μ„œλ“œ λŒ€μ‹  인덱싱과 length μ†μ„±λ§Œ μ‚¬μš©ν•  수 μžˆλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. Array.from()μ΄λ‚˜ spread μ—°μ‚°μž(…)λ₯Ό μ΄μš©ν•΄ λ°°μ—΄λ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. for...of λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ arguments 객체λ₯Ό μˆœνšŒν•˜λ©΄ μ „λ‹¬λœ λͺ¨λ“  인자λ₯Ό μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.