๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

javascript

javascript/์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

 

์ผ๋‹จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž๋ฃŒํ˜•์„ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

์›์‹œ ์ž๋ฃŒํ˜•

Number, String, Boolean, null, undefined ๋“ฑ... ๊ฐ์ฒด๋„ ์•„๋‹ˆ๊ณ  method๋„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ํƒ€์ž…
๋ณ€์ˆ˜์— ์›์‹œ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ €์žฅ๋˜๋ฉฐ, ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์กฐ์ž‘๋œ๋‹ค.

 

์ฐธ์กฐ ์ž๋ฃŒํ˜•

๋ฐฐ์—ด, ๊ฐ์ฒด, ํ•จ์ˆ˜ ๋“ฑ...

๋ณ€์ˆ˜์— ์ฐธ์กฐ ์ž๋ฃŒํ˜•์„ ์ €์žฅํ•˜๋ฉด ๋ณ€์ˆ˜์— ๊ฐ’์ด ์•„๋‹Œ ์ฃผ์†Œ(๊ฐ์ฒด ์ฐธ์กฐ, ์œ„์น˜ ๊ฐ’)๋ฅผ ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(heap)์— ์ €์žฅํ•˜๊ณ ,

๊ทธ ๊ณต๊ฐ„์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์†Œ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์„ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์กฐ์ž‘ํ•จ

=> ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ์†์„ฑ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ฒŒ ๋จ

 


 

๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ์ด์œ ์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

1. ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด

: ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์›๋ณธ์ด ๋ฐ”๋€Œ์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ์›๋ณธ ๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ ๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ (์ด ๋ถ€๋ถ„์€ ์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๋ฆฌ์•กํŠธ ์ˆ˜์—…์„ ๋“ฃ๊ฒŒ ๋˜๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„๋“ฏ...)

: React, Redux ๋“ฑ์—์„œ๋Š” ์ƒํƒœ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋•Œ๋ฌธ์— ๋ณต์‚ฌ -> ์ƒˆ๋กœ์šด ๋ณต์‚ฌ๋ณธ์—์„œ ์ˆ˜์ • -> ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ๊ต์ฒดํ•˜๋Š” ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

3. ํ•จ์ˆ˜๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด

: ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋กœ ๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๋‚ด๋ถ€์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณต์‚ฌ๋ณธ์„ ๋„˜๊ธฐ๋ฉด ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋”๋ผ๋„ ์›๋ณธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

 


 

๋ณต์‚ฌ ๋ฐฉ์‹์—๋Š” ๊นŠ์€ ๋ณต์‚ฌ(Deep copy), ์–•์€ ๋ณต์‚ฌ(Shallow copy)๊ฐ€ ์žˆ๋‹ค. 

 

* ์–•์€ ๋ณต์‚ฌ

1์ฐจ์›๊นŒ์ง€๋Š” ๋ณต์‚ฌ๊ฐ€ ๋˜๋ฉฐ, ์ค‘์ฒฉ๋œ ์ฐธ์กฐ์ž๋ฃŒํ˜•์€ ๋ณต์‚ฌ๊ฐ€ ๋˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

 

- ๋ฐฐ์—ด

  • ...(spread ์—ฐ์‚ฐ์ž) : 1์ฐจ ๊ตฌ์กฐ๋งŒ ๋ณต์‚ฌ
  • slice() : ์›์‹œ๊ฐ’์ด๋ฉด ๋ณ„๊ฐœ ๋ณต์‚ฌ๋˜๊ณ , ์ฐธ์กฐ๊ฐ’์ด๋ฉด ์ฃผ์†Œ๊ฐ€ ๋ณต์‚ฌ๋ผ ์›๋ณธ๊ณผ ์—ฐ๊ฒฐ๋จ (์ฆ‰ 1์ฐจ์›๋งŒ ๋ณต์‚ฌํ•จ)
    • ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ์›์‹œ๊ฐ’์ผ ๋•Œ => ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋จ
    • ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ์ฐธ์กฐ๊ฐ’์ผ ๋•Œ => ์ฐธ์กฐ(์ฃผ์†Œ)๋ฅผ ๋ณต์‚ฌ
  • (๋ณต์‚ฌ ์•„๋‹˜!!) ๋ฐฐ์—ด์˜ ์›๋ณธ์„ ์•„์˜ˆ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์†Œ๋“œ : push, pop, shift, sort, unshift, splice ๋“ฑ

๋ฐฐ์—ด์„ slice()๋กœ ๋ณต์‚ฌํ–ˆ์„ ๋•Œ ์˜ˆ์‹œ ๐Ÿ”ฝ 

// ----- ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ์›์‹œ๊ฐ’์ผ ๋•Œ -----
let arr1 = ['aibao', 'fubao']; // aibao, fubao
let arr2 = arr1.slice(); // aibao, fubao

arr2[1] = 'huibao';

console.log('arr1 : ' + arr1); // arr1 : aibao, fubao
console.log('arr2 : ' + arr2); // arr2 : aibao, huibao

// ----- ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ์ฐธ์กฐ๊ฐ’์ผ ๋•Œ
let arr1 = [{name: 'aibao'}, {name: 'fubao'}];
let arr2 = arr1.slice();

arr2[1].name = 'huibao';

console.log('arr1 : ', arr1);
console.log('arr2 : ', arr2);

 

 

- ๊ฐ์ฒด : ...(spread ์—ฐ์‚ฐ์ž), Object.assign();

 

 

* ๊นŠ์€ ๋ณต์‚ฌ

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

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ์ž์ฒด์ ์œผ๋กœ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. JSON ๊ฐ์ฒด๋ฅผ ํ™œ์šฉ 

์„ฑ๋Šฅ์€ ๊ฐ€์žฅ ๋น ๋ฅด์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉฐ, JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋งŒ ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„๋‹Œ ๊ฐ์ฒด(function)๋Š” undefined๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

const arr1 = [{ name: "aibao" }, { name: "fubao" }];
const arr2 = JSON.parse(JSON.stringify(arr1));

arr2[1].name = "huibao";

console.log("arr1 : ", arr1);
console.log("arr2 : ", arr2);

 

2. Lodash๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

Lodash์˜ clonedeep ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹จ์ ์€ ์„ฑ๋Šฅ์ด ์ข€ ๋А๋ฆฌ๋ฉฐ, ์„ค์น˜๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ๋Œ€์‹  ํ•จ์ˆ˜๋„ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

3. structuredClone() ์‚ฌ์šฉ

๊ฐ„ํŽธํ•˜๋ฉฐ ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€๋งŒ ํ•จ์ˆ˜๋Š” ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

const arr1 = [{ name: "aibao" }, { name: "fubao" }];
const arr2 = JSON.parse(JSON.stringify(arr1));

arr2[1].name = "huibao";

console.log("arr1 : ", arr1);
console.log("arr2 : ", arr2);

 

4. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„

๋ณต์žกํ•˜๋‹ค....

 

 

 

 

์ฐธ๊ณ 
https://developer.mozilla.org/ko/docs/Glossary/Shallow_copy
https://sung-98.tistory.com/111
https://puk0806.tistory.com/117
https://bbangson.tistory.com/78