Shallow Copy vs Deep Copy

ECMAScript์˜ ๋ณ€์ˆ˜๋Š” '์›์‹œ ๊ฐ’'๊ณผ '์ฐธ์กฐ ๊ฐ’' ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์›์‹œ ๊ฐ’์€ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ์ด๋ฉฐ Undefined, Null, Boolean, ์ˆซ์ž, ๋ฌธ์ž์—ด์ด๊ณ , ์ฐธ์กฐ ๊ฐ’์€ ์—ฌ๋Ÿฌ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋Œ€์ž… ์—ฐ์‚ฐ์ž(=)

let person = {
    name: "์ •๋‹คํ˜œ",
    age: 26
};

let  copyPerson = person;
copyPerson.age = 30;

console.log(person.age);            // 30
console.log(copyPerson.age);    // 30

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

https://t1.daumcdn.net/cfile/tistory/9963124F5B24BA3C32

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, = ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด ๋ณต์‚ฌ๋Š” ์ฐธ์กฐ๋งŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๊นจ๋œจ๋ฆฌ๊ณ , ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ, ์ž‘์—…์„ ํ•˜๋ฉด์„œ ๋‹จ์ˆœ ๋Œ€์ž…์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋ณต์‚ฌํ•ด ๋ฒ„๊ทธ๊ฐ€ ์œ ๋ฐœ๋œ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๋‹ค.

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

shallow copy๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•œ depth๋งŒ ๋ณต์‚ฌํ•œ๋‹ค.

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

์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

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

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

copyObj.a = 10;
copyObj.c.c1 = 4;

console.log(obj.a);         // 1
console.log(obj.c.c1);  // 4

๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ๋ณต์‚ฌํ•œ ๋ณ€์ˆ˜์—์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ์›๋ž˜ ๋ณ€์ˆ˜๊ฐ’๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • _.clone()

var person = {
  name: 'faker',
  age: 25
};
var copyPerson = _.clone(person);
  • $.extend()

var person = {
  name: 'faker',
  age: 25
};
var copyPerson = $.extend({},person);

๋‹ค์Œ๊ณผ ๊ฐ™์ด underscore.js์˜ _.clone() ๊ณผ jQuery์˜ $.extend() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋„ ์–•์€ ๋ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

Deep Copy๋Š” ์›๋ณธ ๊ฐ์ฒด๋ฅผ ์™„์ „ํžˆ ๋ณต์‚ฌํ•˜๊ฒŒ ๋œ๋‹ค. Shallow Copy์—์„œ ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•œ ๊ฒƒ ๋˜ํ•œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด ์ƒ์„ฑํ•˜๊ฒŒ๋œ๋‹ค.

https://t1.daumcdn.net/cfile/tistory/99FE624F5B24C82901

์ฃผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • ์žฌ๊ท€ํ˜ธ์ถœ๋กœ ๋ณต์‚ฌ

function deepCopy(obj) {
  if (obj === null || typeof(obj) !== "object") {
    return obj;
  }

  let copy = {};
  for(let key in obj) {
    copy[key] = deepCopy(obj[key]);
  }
  return copy;
}
  • JSON

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

Stringily ๋ฉ”์†Œ๋“œ๋Š” function์˜ ๊ฒฝ์šฐ์— undefined๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(jQuery)

var person = {
  name: 'faker',
  age: 25
};
var copyPerson = $.extend(true, {},person); // DeepCopy flag๋ฅผ true๋กœ ์„ค์ •

์ฐธ๊ณ  ํŽ˜์ด์ง€

Last updated

Was this helpful?