JavaScript/study

[javascript] โญโญ๊ฐ์ฒด์˜ ๊ฐ€๋ณ€๊ฐ’๊ณผ ๊ฐ€๋ณ€์„ฑ (with, ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ) / ์–•์€๋ณต์‚ฌ ๊นŠ์€๋ณต์‚ฌ

์•„2 2023. 5. 23. 14:54
๐Ÿ‘€ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค? ํ•จ์ˆ˜๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ

 

 

๋ฐ์ดํ„ฐํƒ€์ž…์˜ ๊ธฐ๋ณธ ์„ค๋ช…

https://vc-xz.tistory.com/144

 

[javascript] ๋ฐ์ดํ„ฐํƒ€์ž…์˜ ์ข…๋ฅ˜ (๊ธฐ๋ณธํ˜•, ์ฐธ์กฐํ˜•)

*์ฐธ์กฐํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด๋‹ค. * ๋ณต์ œ์˜ ๋ฐฉ์‹ -๊ธฐ๋ณธํ˜• : ๊ฐ’์ด ๋‹ด๊ธด ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๋กœ ๋ณต์ œ -์ฐธ์กฐํ˜• : ๊ฐ’์ด ๋‹ด๊ธด ์ฃผ์†Œ๊ฐ’๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌถ์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋ณต์ œ *๋ถˆ๋ณ€์„ฑ์˜ ์—ฌ๋ถ€ -๊ธฐ๋ณธํ˜• : ๋ถˆ๋ณ€์„ฑ

vc-xz.tistory.com

 

 

 

 

* ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜ํ• ๋‹น์˜ ์ฐจ์ด์ ์€?

-๊ฐ์ฒด์˜ ๋ณ€์ˆ˜ (ํ”„๋กœํผํ‹ฐ) ์˜์—ญ์˜ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ถ€์—ฌํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€! 

 

*๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋œ ๊ฐ’์€ ์—ฌ์ „ํžˆ ๊ณ„์† ๋ถˆ๋ณ€๊ฐ’์ด์ง€๋งŒ(1001,5001,7103 ๋“ฑ)  obj1 ์„ ์œ„ํ•œ ๋ณ„๋„ ์˜์—ญ์€ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ํ”ํžˆ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋ฅผ "๋ถˆ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.(=๊ฐ€๋ณ€ํ•˜๋‹ค)" ๋ผ๊ณ  ํ•œ๋‹ค.

 

*์ฐธ์กฐ์นด์šดํŠธ

- ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’.

์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ธ ๊ฐ์ฒด๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ

 

*๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ(GC, Garbage Collector)

๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ์ง€์›

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค.


๊ฐ์ฒด์—์„œ ๊ฐ€๋ณ€์„ฑ์œผ๋กœ ์ธํ•ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์—์„œ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜์—๋„ ์˜ํ–ฅ์„ ์คŒ.

 

๊ฐ€๋ณ€์„ฑ์˜ ๊ธฐ๋ณธ ์˜ˆ์‹œ์ฝ”๋“œ

const user = {
  name: "Alice",
  age: 30,
};

function changeUserName(userObj, newName) {
  userObj.name = newName;
}

function printUserName(userObj) {
  console.log(userObj.name);
}

changeUserName(user, "Bob");
printUserName(user);  // ์ถœ๋ ฅ: "Bob"

*๊ฐ€๋ณ€์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๊ฒƒ!!!!


๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋‚˜, ๊ทธ ์ค‘์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. ์–•์€ ๋ณต์‚ฌ

2. ๊นŠ์€ ๋ณต์‚ฌ

3. ์ด์™ธ์˜ ๋ฐฉ๋ฒ•๋“ค

 

ํ•˜์ง€๋งŒ ์–•์€ ๋ณต์‚ฌ๋Š” ๋ฐ”๋กœ ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๊ณ ,

๊นŠ์€ ๋ณต์‚ฌ๋Š” undefined,ํ•จ์ˆ˜์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์€ ๋ณต์‚ฌ ํ• ์ˆ˜ ์—†๋Š”๊ฒƒ์„ ์—ผ๋‘ํ•ด๋‘๊ธฐ

 

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

์–•์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ, ๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์†์„ฑ๋“ค๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋‚ด๋ถ€์˜ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ( 1depth๋งŒ ๋ณต์‚ฌ๋จ , 2depth ์ด์ƒ์€ ๋ถˆ๊ฐ€๐Ÿ˜ข )

๋”ฐ๋ผ์„œ ์›๋ณธ ๊ฐ์ฒด์™€ ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋จ.

const original = {
  name: "Alice",
  age: 30,
  address: {
    city: "Seoul",
    country: "South Korea",
  },
};

// ์–•์€ ๋ณต์‚ฌ
const shallowCopy = { ...original };

original.name = "Bob";  // ์›๋ณธ ๊ฐ์ฒด์˜ ์†์„ฑ ๋ณ€๊ฒฝ
original.address.city = "Busan";  // ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์˜ ์†์„ฑ ๋ณ€๊ฒฝ

console.log(original);       // ์ถœ๋ ฅ: { name: "Bob", age: 30, address: { city: "Busan", country: "South Korea" } }
console.log(shallowCopy);    // ์ถœ๋ ฅ: { name: "Alice", age: 30, address: { city: "Busan", country: "South Korea" } }

์œ„์˜ ์˜ˆ์‹œ์—์„œ original ๊ฐ์ฒด๋ฅผ ์–•์€ ๋ณต์‚ฌํ•˜์—ฌ shallowCopy ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ค‘์ฒฉ๋œ address ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— original๊ณผ shallowCopy ๋ชจ๋‘ ๋™์ผํ•œ address ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ original ๊ฐ์ฒด๋‚˜ shallowCopy ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜์—์„œ address์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด์—์„œ๋„ ๋™์ผํ•œ ๋ณ€๊ฒฝ์ด ๋ฐ˜์˜๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ.

 

 

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

๊นŠ์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ, ๋ชจ๋“  ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋“ค๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• (์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ž์ฃผ ์“ฐ)์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์›๋ณธ ๊ฐ์ฒด์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋“ค๋„ ๊ฐ๊ฐ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋จ.

์–•์€๋ณต์‚ฌ์™€ ๋‹ฌ๋ฆฌ 2depth, 3depth๊นŒ์ง€ ์œ ์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ!!

 

โญโญโญโญ์žฌ๊ท€ ๊นŠ์€ ๋ณต์‚ฌ ํ•จ์ˆ˜

- ๋‚ด๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ.  ๋‚ด ์Šค์Šค๋กœ๋ฅผ ์•ˆ์— ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋ชจ๋“  ์š”์†Œ๋“ค์„ ํ™•์ธํ•˜๊ฒ ๋‹ค ๐Ÿ‘๏ธ

var copyObjectDeep = function(target) {
  var result = {};
  if (typeof target === 'object' && target !== null) {
    for (var prop in target) {
      result[prop] = copyObjectDeep(target[prop]);
    }
  } else {
    result = target;
  }
  return result;
};

var original = {
  name: 'Alice',
  age: 30,
  address: {
    city: 'Seoul',
    country: 'South Korea'
  }
};

var deepCopy = copyObjectDeep(original);

console.log(original);  // ์ถœ๋ ฅ: { name: 'Alice', age: 30, address: { city: 'Seoul', country: 'South Korea' } }
console.log(deepCopy);  // ์ถœ๋ ฅ: { name: 'Alice', age: 30, address: { city: 'Seoul', country: 'South Korea' } }

 

JSON์„ ์‚ฌ์šฉํ•œ ๊นŠ์€ ๋ณต์‚ฌ  ์˜ˆ์‹œ์ฝ”๋“œ 

-์ฝ”๋“œ ๊ฐ€๋…์„ฑ์€ ์ข‹์œผ๋‚˜.. ๊ธ€์Ž„..๐Ÿค” 

ํ•จ์ˆ˜๋‚˜ undefined์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ณต์‚ฌ๋˜์ง€ ์•Š์Œ

const original = {
  name: "Alice",
  age: 30,
  address: {
    city: "Seoul",
    country: "South Korea",
  },
};

// ๊นŠ์€ ๋ณต์‚ฌ
const deepCopy = JSON.parse(JSON.stringify(original));

original.name = "Bob";  // ์›๋ณธ ๊ฐ์ฒด์˜ name ์†์„ฑ ๋ณ€๊ฒฝ

console.log(original);   // ์ถœ๋ ฅ: { name: "Bob", age: 30, address: { city: "Seoul", country: "South Korea" } }
console.log(deepCopy);   // ์ถœ๋ ฅ: { name: "Alice", age: 30, address: { city: "Seoul", country: "South Korea" } }

 

 


์˜ˆ์‹œ์ฝ”๋“œ2

// user ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
var user = {
	name: 'wonjang',
	gender: 'male',
};

// ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜, 'changeName'์„ ์ •์˜
// ์ž…๋ ฅ๊ฐ’ : ๋ณ€๊ฒฝ๋Œ€์ƒ user ๊ฐ์ฒด, ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” ์ด๋ฆ„
// ์ถœ๋ ฅ๊ฐ’ : ์ƒˆ๋กœ์šด user ๊ฐ์ฒด
// ํŠน์ง• : ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ(์†์„ฑ)์— ์ ‘๊ทผํ•ด์„œ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ๋„ค์š”! -> ๊ฐ€๋ณ€
var changeName = function (user, newName) {
	var newUser = user;
	newUser.name = newName;
	return newUser;
};

// ๋ณ€๊ฒฝํ•œ user์ •๋ณด๋ฅผ user2 ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
// ๊ฐ€๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— user1๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋ ๊ฑฐ์—์š”.
var user2 = changeName(user, 'twojang');

// ๊ฒฐ๊ตญ ์•„๋ž˜ ๋กœ์ง์€ skipํ•˜๊ฒŒ ๋ ๊ฒ๋‹ˆ๋‹ค.
if (user !== user2) {
	console.log('์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
}

console.log(user.name, user2.name); // twojang twojang
console.log(user === user2); // true

์˜ˆ์‹œ์ฝ”๋“œ2 ๊ฐœ์„ 

// user ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
var user = {
	name: 'wonjang',
	gender: 'male',
};

// ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜ ์ •์˜
// ์ž…๋ ฅ๊ฐ’ : ๋ณ€๊ฒฝ๋Œ€์ƒ user ๊ฐ์ฒด, ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” ์ด๋ฆ„
// ์ถœ๋ ฅ๊ฐ’ : ์ƒˆ๋กœ์šด user ๊ฐ์ฒด
// ํŠน์ง• : ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์•„์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ -> ๋ถˆ๋ณ€
var changeName = function (user, newName) {
	return {
		name: newName,
		gender: user.gender,
	};
};

// ๋ณ€๊ฒฝํ•œ user์ •๋ณด๋ฅผ user2 ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
// ๋ถˆ๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— user1์€ ์˜ํ–ฅ์ด ์—†์–ด์š”!
var user2 = changeName(user, 'twojang');

// ๊ฒฐ๊ตญ ์•„๋ž˜ ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๊ฒ ๋„ค์š”.
if (user !== user2) {
	console.log('์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
}

console.log(user.name, user2.name); // wonjang twojang
console.log(user === user2); // false ๐Ÿ‘

์˜ˆ์‹œ์ฝ”๋“œ2 ๋” ๋‚˜์€ ์˜ˆ์‹œ์ฝ”๋“œ (์–•์€ ๋ณต์‚ฌ)

//์œ„ ํŒจํ„ด์„ ์šฐ๋ฆฌ ์˜ˆ์ œ์— ์ ์šฉํ•ด๋ด…์‹œ๋‹ค.
var user = {
	name: 'wonjang',
	gender: 'male',
};

var user2 = copyObject(user);
user2.name = 'twojang';

if (user !== user2) {
	console.log('์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
}

console.log(user.name, user2.name);
console.log(user === user2);

์˜ˆ์‹œ์ฝ”๋“œ 2 ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ + ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์‹œ ๊ทธ ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌ => ์žฌ๊ท€์  ์ˆ˜ํ–‰๋ฐฉ์‹

var copyObjectDeep = function(target) {
	var result = {};
	if (typeof target === 'object' && target !== null) {
		for (var prop in target) {
			result[prop] = copyObjectDeep(target[prop]);
		}
	} else {
		result = target;
	}
	return result;
}