๐Ÿ’ป๊ฐœ๋ฐœ๊ณต๋ถ€/JavaScript

JavaScript ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

Jee-young 2024. 1. 29. 22:49

ES6(ECMAScript 2015) ์—์„œ ์ƒˆ๋กœ ์ƒ๊ธด spread operator. 

spread operator๋Š” ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ(iterable) ๊ฐ์ฒด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์œผ๋กœ,

๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด ๋“ฑ์„ ๊ฐœ๋ณ„ ์š”์†Œ๋กœ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 

// ES6์—์„œ๋Š” ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ• ์‚ฌ์šฉ ๊ฐ€๋Šฅ
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];

 

์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?๐Ÿค”

์›๋ณธ๋ฐฐ์—ด ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋‹ค. 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋Š” ์ฐธ์กฐ์— ์˜ํ•ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—

๊ทธ๋ƒฅ ๋Œ€์ž…ํ•˜๋ฉด ์ฐธ์กฐ ์ฃผ์†Œ๋งŒ ๋ณต์‚ฌ๋˜์–ด ๋‘ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋จ. 

 

์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ• ์‚ฌ์šฉํ• ๋•Œ vs ์‚ฌ์šฉ์•ˆํ• ๋•Œ ์ฐจ์ด์ ์€? 

// ์›๋ณธ ๋ฐฐ์—ด
const originalArray = [1, 2, 3];

// ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ๋ณต์‚ฌ
const copiedArray = [...originalArray];

// ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์š”์†Œ ์ถ”๊ฐ€
copiedArray.push(4);

console.log(originalArray); // [1, 2, 3]
console.log(copiedArray);   // [1, 2, 3, 4]

 

์—ฌ๊ธฐ์„œ copiedArray ๋Š” originalArray ์˜ ๋ณต์‚ฌ๋ณธ์ด๋ฉฐ, ์›๋ณธ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ ๊ฒƒ์ด๋‹ค. 

๋งŒ์•ฝ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋Œ€์ž…ํ•œ๋‹ค๋ฉด?

 

// ์›๋ณธ ๋ฐฐ์—ด
const originalArray = [1, 2, 3];

// ๋ฐฐ์—ด์„ ๊ทธ๋ƒฅ ๋Œ€์ž…
const copiedArray = originalArray;

// ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์š”์†Œ ์ถ”๊ฐ€
copiedArray.push(4);

console.log(originalArray); // [1, 2, 3, 4] <-- ์›๋ณธ ๋ฐฐ์—ด๋„ ๋ณ€๊ฒฝ๋จ
console.log(copiedArray);   // [1, 2, 3, 4]

 

์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณต์‚ฌํ•˜๊ณ , ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. 

 

Object ์ž์ฒด๋Š” iterable ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ES6 ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ. 

// ๊ฐ์ฒด์— ๋Œ€ํ•œ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์€ ES6์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Œ
const obj1 = { a: 1, b: 2 }; โŒ
// const obj2 = { ...obj1 }; // ์ด ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ

 

๊ฐ์ฒด์—์„œ๋„ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ES2018 ์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

// ์›๋ณธ ๊ฐ์ฒด
const originalObject = { name: 'John', age: 25 };

// ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ๋ณต์‚ฌ
const copiedObject = { ...originalObject };

// ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— ์†์„ฑ ์ถ”๊ฐ€ ๋˜๋Š” ๋ณ€๊ฒฝ
copiedObject.city = 'New York';

console.log(originalObject); // { name: 'John', age: 25 }
console.log(copiedObject);   // { name: 'John', age: 25, city: 'New York' }

 

Javascript์—์„œ Array์™€ Object ๋Š” Refernce Type์ด๋ฉด์„œ, ๋™์‹œ์— Mutable(๊ฐ€๋ณ€) Type ์ด๋‹ค. 

 

Refernce Type์€ ๊ฐ’์„ ์ €์žฅํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š”ํƒ€์ž…. 

๋”ฐ๋ผ์„œ ์›๋ณธ ๋ฐฐ์—ด ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ์‹œ, ๋‘ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด ํ•œ์ชฝ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋‹ค๋ฅธ์ชฝ๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ๋œ๋‹ค. 

 

Mutable Type์€ ๊ฐ’์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•œ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์—์„œ๋„ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•œ๊ฒƒ. 

 

์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์‚ฌ๊ฐ’์„ ์›๋ณธ๊ณผ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

๋ณต์‚ฌ๋ณธ์„ ๋ณ€๊ฒฝํ•ด๋„, ์›๋ณธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€์•Š๋Š”๋‹ค. 

-> ์ด๊ฒƒ์ด Immutability(๋ถˆ๋ณ€์„ฑ) ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜์ž„! ๋ถˆ๋ณ€์„ฑ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ „์„ฑ์„ ๋†’์ด๋Š”๋ฐ ๋„์›€์ด๋œ๋‹ค.