Chapter 09: Spread์™€ Rest (Spread operator and rest parameters)

๐Ÿ’ก ๋„์„œ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ต์‹ฌ ๊ฐ€์ด๋“œ๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

9.1 The Spread operator (์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž)


  • spread ๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜๋ฏธ๋Š” ํŽผ์น˜๋‹ค, ํผ๋œจ๋ฆฌ๋‹ค
  • ์ด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•œ ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด ํ˜น์€ ๋ฐฐ์—ด์„ ํŽผ์น  ์ˆ˜ ์žˆ์Œ
  • ๊ธฐ์กด์˜ ๋ฐฐ์—ด ํ˜น์€ ๊ฐ์ฒด๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ๋ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ → ๊ธฐ์กด์˜ ๊ฒƒ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ
// ...[1, 2, 3]์€ [1, 2, 3]์„ ๊ฐœ๋ณ„ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค(→ 1, 2, 3)
console.log(...[1, 2, 3]); // 1 2 3

// ๋ฌธ์ž์—ด์€ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค.
console.log(...'Hello'); // H e l l o

// ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ์•„๋‹Œ ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์—†๋‹ค.
console.log(...{ a: 1, b: 2 });
// TypeError: Found non-callable @@iterator

// ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž์˜ ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์˜ค์ง ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๊ฐ’์˜ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋งฅ ๋‚ด์˜ ๊ฐ’์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const list = ...[1, 2, 3]; // SyntaxError: Unexpected token ...

๋ฐฐ์—ด์˜ ๊ฒฐํ•ฉ

const veggie = ["tomato","cucumber","beans"];
const meat = ["pork","beef","chicken"];

const menu = [...veggie, "pasta", ...meat];
console.log(menu);
// Array [ "tomato", "cucumber", "beans", "pasta", "pork", "beef", "chicken" ]

๋ฐฐ์—ด์˜ ๋ณต์‚ฌ

๋ฐฐ์—ด์˜ ์ฐธ์กฐ

ํ•˜๋‹จ์˜ ์ฝ”๋“œ๋Š” ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•œ ๊ฒƒ ๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ newVeggie๋Š” ๋ฐฐ์—ด veggie๋ฅผ ์ฐธ์กฐํ•  ๋ฟ์ด๋‹ค.

const veggie = ["tomato","cucumber","beans"];
const newVeggie = veggie;

veggie.push("peas");
console.log(veggie);
// Array [ "tomato", "cucumber", "beans", "peas" ]

console.log(newVeggie);
// Array [ "tomato", "cucumber", "beans", "peas" ]

๋ฐฐ์—ด์˜ ๋ณต์‚ฌ : ES5 - concat ์‚ฌ์šฉ

const veggie = ["tomato","cucumber","beans"];
const newVeggie = [].concat(veggie);
veggie.push("peas");
console.log(veggie);
// Array [ "tomato", "cucumber", "beans", "peas" ]
console.log(newVeggie);
// Array [ "tomato", "cucumber", "beans" ]

๋ฐฐ์—ด์˜ ๋ณต์‚ฌ : ES6 - spread ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

const veggie = ["tomato","cucumber","beans"];
const newVeggie = [...veggie];
veggie.push("peas");
console.log(veggie);
// Array [ "tomato", "cucumber", "beans", "peas" ]
console.log(newVeggie);
// Array [ "tomato", "cucumber", "beans" ]

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž

const slime = {
  name: '์Šฌ๋ผ์ž„'
};

const cuteSlime = {
  ...slime,
  attribute: 'cute'
};

const purpleCuteSlime = {
  ...cuteSlime,
  color: 'purple'
};

console.log(slime); // Object {name: '์Šฌ๋ผ์ž„'}
console.log(cuteSlime); // Object {name: '์Šฌ๋ผ์ž„', attribute: 'cute'}
console.log(purpleCuteSlime); // Object {name: '์Šฌ๋ผ์ž„', attribute: 'cute', color: 'purple'}

ํ•จ์ˆ˜ ์ธ์ž์™€ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž

๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋“ค์„ ๋ชจ๋‘ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

const numbers = [1, 2, 3, 4, 5, 6];

function sum(...rest) {
  return rest.reduce((acc, current) => acc + current, 0);
}

// ES5
const result = sum(
  numbers[0],
  numbers[1],
  numbers[2],
  numbers[3],
  numbers[4],
  numbers[5]
);
console.log(result);

// ES5 - ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์ธ์ˆ˜ ์ „๋‹ฌ
const result = sum.apply(null, numbers);
console.log(result);

// ES6
const numbers = [1, 2, 3, 4, 5, 6];
const result = sum(...numbers);
console.log(result);

9.2 Rest Parameter (๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ)


  • ํ™•์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” Spread์™€๋Š” ๋ฐ˜๋Œ€๋กœ, ์—ฌ๋Ÿฌ ์›์†Œ๋ฅผ ํ•˜๋‚˜์˜ ์›์†Œ๋กœ ์••์ถ•ํ•˜๋Š” ์—ญํ• 
  • ๊ฐ์ฒด, ๋ฐฐ์—ด, ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํ‚ค์›Œ๋“œ๊ฐ€ ๊ผญ rest์ผ ํ•„์š”๋Š” ์—†์œผ๋‚˜ ๊ด€์šฉ์ ์œผ๋กœ rest๊ฐ€ ์‚ฌ์šฉ๋จ

๊ฐ์ฒด์—์„œ์˜ rest

const purpleCuteSlime = {
  name: '์Šฌ๋ผ์ž„',
  attribute: 'cute',
  color: 'purple'
};

const { color, ...rest } = purpleCuteSlime;
console.log(color); // purple
console.log(rest); // Object {name: "์Šฌ๋ผ์ž„", attribute: "cute"}

ํ‚ค์›Œ๋“œ, ์ฆ‰ ์ถ”์ถœํ•œ ๊ฐ’์˜ ์ด๋ฆ„์ด ๊ผญ rest์ผ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

const purpleCuteSlime = {
  name: '์Šฌ๋ผ์ž„',
  attribute: 'cute',
  color: 'purple'
};

const { color, ...cuteSlime } = purpleCuteSlime;
console.log(color); // purple
console.log(cuteSlime);  // Object {name: "์Šฌ๋ผ์ž„", attribute: "cute"}

const { attribute, ...slime } = cuteSlime;
console.log(attribute); // cute
console.log(slime);  // Object {name: "์Šฌ๋ผ์ž„"}

๋ฐฐ์—ด์—์„œ์˜ rest

const numbers = [0, 1, 2, 3, 4, 5, 6];

const [one, ...rest] = numbers;

console.log(one);
console.log(rest);

rest ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‚ฌ์šฉ ์‹œ ๊ผญ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

const numbers = [0, 1, 2, 3, 4, 5, 6];

const [..rest, last] = numbers;

ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ์˜ rest

ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ช‡ ๊ฐœ๊ฐ€ ๋  ์ง€ ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ์—์„œ rest ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ์œ ์šฉ

// ES5
function sum(a, b, c, d, e, f, g) {
  let sum = 0;
  if (a) sum += a;
  if (b) sum += b;
  if (c) sum += c;
  if (d) sum += d;
  if (e) sum += e;
  if (f) sum += f;
  if (g) sum += g;
  return sum;
}

const result = sum(1, 2, 3, 4, 5, 6);
console.log(result);

// ES6
function sum(...rest) {
  return rest.reduce((acc, current) => acc + current, 0);
}

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

9.3 Spread์™€ Rest์˜ ์ฐจ์ด


Spread

  • Spread๋Š” ๊ธฐ์กด ์žฅ์†Œ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ƒˆ๋กœ์šด ์žฅ์†Œ์— ํ’€์–ด๋‚ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
  • ์‚ฌ์šฉ ์œ„์น˜(์ˆœ์„œ) ์ƒ๊ด€ ์—†์Œ
  • ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ ์‹œ, ํ•จ์ˆ˜์˜ ์ธ์ž ์ž๋ฆฌ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Rest

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

์˜ˆ์‹œ ์ฝ”๋“œ

function sum(...rest) { // ์ธ์ˆ˜์— ์‚ฌ์šฉ๋œ ...์€ rest
  return rest.reduce((acc, current) => acc + current, 0);
}

const numbers = [1, 2, 3, 4, 5, 6];
const result = sum(...numbers); // ์ธ์ž์— ์‚ฌ์šฉ๋œ ...์€ spread
console.log(result);

๐Ÿ“Ž ์ฐธ๊ณ