[JS] ๐Ÿ’ฆ์ „๊ฐœ ์—ฐ์‚ฐ์ž Spread!!

Shyยท2024๋…„ 5์›” 13์ผ

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
5/5

Spread ์—ฐ์‚ฐ์ž

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(Spread Operator)๋Š” ECMAScript6(2015)์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ฌธ๋ฒ•์œผ๋กœ, ์„ธ ๊ฐœ์˜ ์ (...)์œผ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์˜ ์š”์†Œ๋“ค์„ ๊ฐœ๋ณ„ ์š”์†Œ๋กœ ๋ถ„ํ•ดํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์ฃผ๋กœ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์˜ ๋ณต์‚ฌ, ๋ณ‘ํ•ฉ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ธ์ž ์ „๋‹ฌ ๋“ฑ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

// ํŽผ์น  ๋Œ€์ƒ์ด ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ
{...obj}

// ํŽผ์น  ๋Œ€์ƒ์ด ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ
[...arr]
// ํ˜น์€
{...arr}

๋ฐฐ์—ด์—์„œ Spread

1. ๋ฐฐ์—ด๋ณต์‚ฌ

arr1์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ arr2์— ๋ณต์‚ฌํ•œ๋‹ค. arr2๋Š” arr1๊ณผ ๋ณ„๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด๋‹ค.

const arr1 = [1, 2, 3];
const arr2 = [...arr1];
console.log(arr2); // [1, 2, 3]

2. ๋ฐฐ์—ด๋ณ‘ํ•ฉ

๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•˜๋Š”๋ฐ, ES5 ๋ฐฐ์—ด ๋ณ‘ํ•ฉ๊ณผ ES6์˜ ๋ฐฐ์—ด ๋ณ‘ํ•ฉ์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

// ES5 ๋ฐฐ์—ด์˜ ๋ณ‘ํ•ฉ: concat์„ ์‚ฌ์šฉ
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [7, 8, 9];
const arrWrap = arr1.concat(arr2, arr3);

console.log(arrWrap); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
// ES6 ๋ฐฐ์—ด์˜ ๋ณ‘ํ•ฉ: Spread์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฐฐ์—ด๋กœ ๋‹ค์‹œ ๋ฌถ์Œ
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const merged = [...arr1, ...arr2];
console.log(merged); // [1, 2, 3, 4, 5, 6]

3. ๋ฐฐ์—ด์˜ ์š”์†Œ ์ถ”๊ฐ€

๋ฐฐ์—ด์˜ ์•ž์ด๋‚˜ ๋’ค์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

const arr1 = [1, 2, 3];
const newArr = [0, ...arr1, 4];
console.log(newArr); // [0, 1, 2, 3, 4]

4. ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ ํ• ๋‹น

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น๊ณผ ๋‚˜๋จธ์ง€ ์š”์†Œ(๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

const [first, second, ...rest] = [1, 2, 3, 4, 5];

console.log(first); // 1
console.log(second); // 2
console.log(rest); // [3, 4, 5]

๊ฐ์ฒด์—์„œ Spread

1. ๊ฐ์ฒด ๋ณต์‚ฌ

obj1์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ obj2์— ๋ณต์‚ฌํ•œ๋‹ค. obj2๋Š” obj1๊ณผ ๋ณ„๊ฐœ์˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์ด๋‹ค.

const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1 };
console.log(obj2); // { a: 1, b: 2 }

2. ๊ฐ์ฒด ๋ณ‘ํ•ฉ

๋‘ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ณ‘ํ•ฉํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, obj1๊ณผ obj2์— ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ b๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๋งˆ์ง€๋ง‰์— ์Šคํ”„๋ ˆ๋“œ๋œ ๊ฐ์ฒด(obj2)์˜ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง„๋‹ค.

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 3, c: 4 }

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์˜ ์‚ฌ์šฉ

๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„ ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

function sum(x, y, z) {
  return x + y + z;
}
const numbers = [1, 2, 3];
console.log(sum(...numbers)); // 6

Rest ํŒŒ๋ผ๋ฏธํ„ฐ์™€์˜ ์ฐจ์ด

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž์™€ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์œผ๋กœ Rest ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋‹ค. Rest ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•จ์ˆ˜ ์ •์˜ ์‹œ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ์ธ์ˆ˜๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ชจ์œผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์˜ˆ์ œ1: ์ธ์ˆ˜ ์ค‘ ์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ

์—ฌ๊ธฐ์„œ findMin ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ์ˆซ์ž ์ธ์ˆ˜ ์ค‘์—์„œ ์ตœ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Rest ํŒŒ๋ผ๋ฏธํ„ฐ ...numbers๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ์ˆ˜์ง‘ํ•œ ํ›„, Math.min() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.

function findMin(...numbers) {
  return Math.min(...numbers);
}

console.log(findMin(5, 2, 10, 3)); // 2
console.log(findMin(12, 6, 8)); // 6

์˜ˆ์ œ2. ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ์กฐํ•ฉํ•˜๊ธฐ

์ด ํ•จ์ˆ˜๋Š” ์ž„์˜์˜ ์ˆ˜์˜ ๋ฌธ์ž์—ด ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๊ฒฐํ•ฉํ•œ๋‹ค. ๊ฐ ๋ฌธ์ž์—ด ์‚ฌ์ด์— ๊ณต๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ฐ๊ฒฐํ•œ๋‹ค.

function concatenateStrings(...strings) {
  return strings.join(' ');
}

console.log(concatenateStrings("Hello", "world!")); // "Hello world!"
console.log(concatenateStrings("How", "are", "you", "today?")); // "How are you today?"

์˜ˆ์ œ3. reduce๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ

reduce๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์— ์žˆ๋Š” ์š”์†Œ๋“ค์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž. reduceํ•จ์ˆ˜์˜ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

array.reduce(function(accumulator, currentValue, currentIndex, array) {
  // ํ•จ์ˆ˜ ๋ณธ๋ฌธ
}, initialValue)
  • accumulator: ์ด์ „ ์ฝœ๋ฐฑ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด๋‚˜, ์ œ๊ณต๋œ ์ดˆ๊ธฐ๊ฐ’์ด๋‹ค.
  • currentValue:: ๋ฐฐ์—ด์—์„œ ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ์š”์†Œ์ด๋‹ค.
  • currentIndex: (์„ ํƒ์ ): ๋ฐฐ์—ด์—์„œ ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ์š”์†Œ์˜ ์ธ๋ฑ์Šค์ด๋‹ค.
  • array: (์„ ํƒ์ ): reduce๊ฐ€ ํ˜ธ์ถœ๋œ ๋ฐฐ์—ด์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, reduceํ•จ์ˆ˜๋Š” accumulator์™€ currentValue๋งŒ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋”ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (currentIndex์™€ array๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ๋žต๋˜์—ˆ๋‹ค.)

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce(function(acc, val) {
  return acc + val;
}, 0); // 10

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค.
const sum = numbers.reduce((acc, val) => acc + val, 0); // 10

๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™œ์šฉํ•œ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ...

Rest ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํŠน์ง•

  • ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ์ฃผ๋กœ ๊ฐ€๋ณ€์ ์ธ ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  • ํ•จ์ˆ˜์—์„œ ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋งŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

Rest ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•จ์ˆ˜์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ ์ฃผ๊ณ , ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š” ์—†์ด ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งž์ถฐ ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

profile
์‹ ์ž…์‚ฌ์›...

0๊ฐœ์˜ ๋Œ“๊ธ€