JavaScript

๋ฐ์ดํ„ฐ ํ• ๋‹น๊ณผ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ (feat. ๊นŠ์€ ๋ณต์‚ฌ, ์–•์€ ๋ณต์‚ฌ)

stoneeee 2023. 2. 6. 01:20

 

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” byte ๋‹จ์œ„์˜ ์‹๋ณ„์ž(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Ÿ๊ฐ’)๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„ํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ๋‹ค. 

 

 

๋ณ€์ˆ˜ a์— 1์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

let a; // (1) ๋ณ€์ˆ˜ a ์„ ์–ธ
a = 1; // (2) ๋ณ€์ˆ˜ a์— ๋ฐ์ดํ„ฐ 1 ํ• ๋‹น

(1)์˜ ๊ณผ์ •์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ณ€์ˆ˜ ์˜์—ญ์— ๋นˆ์นธ์„ ํ™•๋ณดํ•˜๊ณ  ์‹๋ณ„์ž๋กœ a๋ฅผ ์ง€์ •ํ•œ๋‹ค. 

(2)์˜ ๊ณผ์ •์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์— 1์„ ์ €์žฅํ•œ ๋’ค, ๋ณ€์ˆ˜ a๊ฐ€ 1์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค.

 

 

 

 

 

 

๋งŒ์•ฝ ๋ณ€์ˆ˜ a์˜ ๊ฐ’์„ 2๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด a = 2;๋ผ๋Š” ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌํ• ๋‹นํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋œ 1์ด๋ผ๋Š” ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

์ด๋•Œ, 1์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” garbage collecting์˜ ๋Œ€์ƒ์ด ๋˜์–ด ์ œ๊ฑฐ๋œ๋‹ค.

 

 

 

 

์—ฐ์‚ฐ์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

a *= 2;๋ผ๋Š” ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•  ๋•Œ์—๋„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋œ 1์˜ ๊ฐ’์— ๊ณฑํ•˜๊ธฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹๋ณ„์ž a๊ฐ€ ์—ฐ์‚ฐ๊ฐ’์ธ 2๋ผ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

 

 

๋งŒ์•ฝ a๋ฅผ ๋ณต์‚ฌํ•ด์„œ b๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , b์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•œ๋‹ค๊ณ  ํ•ด๋„ a์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

์žฌํ• ๋‹น ๊ณผ์ •์—์„œ b๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

let b = a;
b = 2;

console.log(a); // 1
console.log(b); // 2
console.log(a === b); // false

 

 

์ด๋ ‡๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋œ ๊ฐ’์€ gc๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€๊ฐ’์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

 

 

 

 

์ฐธ์กฐํ˜• ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋Š” ์‹๋ณ„์ž๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ค‘๊ฐœ์—…์ž๊ฐ€ ๋ผ๊ฒŒ ๋œ๋‹ค.

 

let obj1 = {
  a: 1,
  b: 2,
};

 

์œ„์˜ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ์—๋Š” obj1์ด๋ผ๋Š” ์‹๋ณ„์ž๊ฐ€ ๋ณ€์ˆ˜ ์˜์—ญ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•œ ๋’ค, obj1์˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ €์žฅํ•  ๋ณ€์ˆ˜ ์˜์—ญ์ด ์ƒ์„ฑ๋œ๋‹ค.

obj1์˜ ๋ณ€์ˆ˜ ์˜์—ญ์— ์ €์žฅ๋œ a, b๋ผ๋Š” ์‹๋ณ„์ž๋“ค์€ ๊ฐ๊ฐ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์žˆ๋Š” 1, 2๋ผ๋Š” ๊ฐ’์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

๋˜ํ•œ ๋ฐ์ดํ„ฐ ์˜์—ญ์—๋Š” a์™€ b ๊ฐ™์€ obj1์˜ ๋ณ€์ˆ˜๋“ค์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , obj1์€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

 

์œ„์˜ obj1์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•œ obj2๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

let obj2 = obj1;

 

์ด๋ ‡๊ฒŒ ๋ณต์‚ฌํ•œ๋‹ค๋ฉด ๊ฐ์ฒด๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

 

 

 

 

์ด ๊ฒฝ์šฐ์—๋Š” obj1๊ณผ obj2๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด ๋™์ผํ•˜๋‹ค. ๋”ฐ๋ผ์„œ obj1 === obj2๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ obj2์˜ b๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด, ๋™์ผํ•œ b ์‹๋ณ„์ž์˜ ์ฐธ์กฐ๊ฐ’์ด ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— obj2 ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ obj1์˜ b๊ฐ’๋„ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

๋˜ํ•œ obj1๊ณผ obj2๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ์— ๊ฐ™์€ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

obj2.b = 3;

console.log(obj1.b); // 3
console.log(obj2.b); // 3
console.log(obj1 === obj2); // true

 

 

 

 

 

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ’์˜ ์ฃผ์†Ÿ๊ฐ’์ด ์•„๋‹Œ ๋ฐ”๋กœ ์•„๋ž˜ ๋‹จ๊ณ„์˜ ์ฃผ์†Ÿ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์–•์€ ๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

 

// (1) spread ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
let obj3 = { ...obj1 };

// (2) for๋ฌธ ์ด์šฉ
let copy = (obj) => {
  let newObj = {};
  for (let prop in obj) {
    newObj[prop] = obj[prop];
  }
  return newObj;
};
let obj4 = copy(obj1);

obj3.b = 4;
obj4.b = 4;

console.log(obj1.b); // 3
console.log(obj3.b); // 4
console.log(obj4.b); // 4

 

spread ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋˜ for๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๋ณต์‚ฌํ•˜๋˜ obj3, obj4๋ผ๋Š” ์ƒˆ ๊ฐ์ฒด์— obj1์˜ ๊ฐ๊ฐ์˜ ํ”„๋กœํผํ‹ฐ๋“ค์ด ์ƒˆ๋กœ ๋ณต์‚ฌ๋˜๊ณ , ๋”ฐ๋ผ์„œ obj1๊ณผ obj3, obj4๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Ÿ๊ฐ’์€ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— obj1๊ณผ obj3, obj4๋Š” ๋ชจ๋‘ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๊ณ , obj3์ด๋‚˜ obj4์˜ b ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ๊ฒŒ ๋˜๋”๋ผ๋„ obj1์—๋Š” ์˜ํ–ฅ์ด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.

 

 

obj4๋„ ๋™์ผ

 

 

 

ํ•˜์ง€๋งŒ ์œ„์˜ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋”๋ผ๋„, ์•„๋ž˜์˜ obj ๊ฐ์ฒด์™€ ๊ฐ™์ด ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ–๋Š” ๊ฒฝ์šฐ์—๋Š” ์–•์€ ๋ณต์‚ฌ๋งŒ ์ง„ํ–‰๋œ๋‹ค. 

 

let obj = {
  a: 1,
  b: [1, 2, 3],
};

 

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

๊นŠ์€ ๋ณต์‚ฌ๋Š” ์–•์€ ๋ณต์‚ฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ๊ธฐ๋ณธํ˜• ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ์˜ ์ฃผ์†Ÿ๊ฐ’์„ ์•Œ์•„๋‚ผ ๋•Œ๊นŒ์ง€ ํŒŒ๊ณ ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

 

let deepCopy = (target) => {
  let result = {};
  if (typeof target === 'object' && target !== null) {
    for (let prop in target) {
      result[prop] = deepCopy(target[prop]);
    }
  } else {
    result = traget;
  }
  return result;
};

let newObj1 = deepCopy(obj);

 

 

 

๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ํ†ต์งธ๋กœ JSON String์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚จ ๋’ค ๋‹ค์‹œ JS ์ž๋ฃŒํ˜•์œผ๋กœ ํŒŒ์‹ฑ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

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

 

์ •๋ง ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณต์‚ฌ๊ฐ€ ์ง„ํ–‰๋˜์ง€๋งŒ, prototype๊ณผ ๊ฐ™์ด ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ๋‚˜ ์—ฌํƒ€ ๋ฉ”์„œ๋“œ ๋“ฑ์€ JSON์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ•ด์„œ ๊ทธ๋ƒฅ ๋ฌด์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.

 

 

 

 

 

 

Reference : ์ •์žฌ๋‚จ, โŒœ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธโŒŸ, ์œ„ํ‚ค๋ถ์Šค, 2019