๐Ÿ“• Language/JavaScript

[javascript] ์ฐธ์กฐํ˜•์˜ ์–•์€ ๋ณต์‚ฌ(Shallow Copy) & ๊นŠ์€ ๋ณต์‚ฌ(Deep Copy)

a n u e 2023. 2. 3. 10:08

 

์ž์ฃผ ํ—ท๊ฐˆ๋ ค์„œ ์ฐธ์กฐํ˜•์€ ์•„๋ฌป๋”ฐ JSON.parse()์™€ JSON.stringify()๋ฅผ ์ด์šฉํ•˜์—ฌ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•ด์™”๋Š”๋ฐ 

์ด ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์•„๋ž˜์— ๊ฐ™์ด ์ด์•ผ๊ธฐํ•˜๊ฒ ๋‹ค.

 

๊ฐ์ฒด๋Š” ์ฐธ์กฐํ˜•์ด๋ผ ๋ณต์‚ฌ ์‹œ, '='๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ’์ด ๋ณต์‚ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋‹จ์ง€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.

์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.


โ–  ์–•์€ ๋ณต์‚ฌ(Shallow Copy) 

 

1. Object.assign(target, ...sources)

๊ฐ์ฒด ์ž์ฒด๋Š” ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ๊ฐ์ฒด๊ฐ€ 2์ฐจ์› ์ด์ƒ์ด๋ผ๋ฉด ์–•์€ ๋ณต์‚ฌ๊ฐ€ ๋œ๋‹ค. 

let obj = {
    a: 1,
    b: { c: 2 }
};

let copyObj = Object.assign({}, obj);

console.log(obj === copyObj) //false
console.log(obj.b.c === copyObj.b.c) //true

 

2. ... (Spread Operator)

์ „๊ฐœ ๊ตฌ๋ฌธ ๋˜ํ•œ, ๊ฐ์ฒด ์ž์ฒด๋Š” ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‚˜ ๋‚ด๋ถ€ ๊ฐ์ฒด๋Š” ์–•์€ ๋ณต์‚ฌ๊ฐ€ ๋œ๋‹ค.

let obj = {
    a: 1,
    b: { c: 2 }
};

let copyObj = { ...obj}

console.log(obj === copyObj) //false
console.log(obj.b.c === copyObj.b.c) //true

โ–  ๊นŠ์€ ๋ณต์‚ฌ(Deep Copy) 

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์œผ๋‚˜ ๋ณดํ†ต์€ lodash ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. 

 

1. _.cloneDeep(value)

const obj = [{ 'a': 1 }, { 'b': 2 }];
 
const copyObj = _.cloneDeep(obj);

console.log(copyObj[0] === obj[0]); //false

์ฐธ๊ณ 

_.clone(value) ์€ ๊นŠ์€ ๋ณต์‚ฌ X

const obj = [{ 'a': 1 }, { 'b': 2 }];
 
const copyObj = _.clone(obj);

console.log(copyObj[0] === obj[0]); //true

 

2. JSON.parse(JSON.stringify(value));

๋ณดํ†ต์€ ์ •์ƒ์ ์œผ๋กœ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋œ๋‹ค.

const obj = {
    a: 1,
    b: { c: 2 }
};

const copyObj = JSON.parse(JSON.stringify(obj));

console.log(obj.b.c === copyObj.b.c) //false

ํ•˜์ง€๋งŒ, ์˜ˆ์™ธ์‚ฌํ•ญ์ด ํ•˜๋‚˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฌดํ„ฑ๋Œ€๊ณ  ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

๊ฐ์ฒด์— ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋Š”, ์ฆ‰ value ๊ฐ’์ด ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ๋Š” ๋ณต์‚ฌ๋ฅผ ์ƒ๋žตํ•œ๋‹ค.

const obj = {
    a: 1,
    b: { c: 2 },
    c : function() {
    	console.log('function์ž…๋‹ˆ๋‹ค.');
    }
};

const copyObj = JSON.parse(JSON.stringify(obj));

console.log(obj.b.c === copyObj.b.c) //true

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•„์ง๊นŒ์ง€๋Š” lodash์—์„œ ์ œ๊ณตํ•˜๋Š” cloneDeep์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•ด๋ณด์ธ๋‹ค.

 

https://lodash.com/docs/4.17.15#clone

 

Lodash Documentation

_(value) source Creates a lodash object which wraps value to enable implicit method chain sequences. Methods that operate on and return arrays, collections, and functions can be chained together. Methods that retrieve a single value or may return a primiti

lodash.com