B14 : ๊ฐ์ฒด์˜ ๋ณต์‚ฌ

2025. 8. 19. 13:44ใ†Front-end/JavaScript

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. ๊ฐ์ฒด์˜ ์ €์žฅ๊ณผ ๋ณต์‚ฌ

2. ๊ฐ์ฒด์˜ ๋น„๊ต

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

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


1. ๊ฐ์ฒด์˜ ์ €์žฅ๊ณผ ๋ณต์‚ฌ

์›์‹œํƒ€์ž…๋“ค์€ '๊ฐ’ ์ž์ฒด'๊ฐ€ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๋ฐ˜๋ฉด,

๊ฐ์ฒด๋Š” ๊ฐ’์ด ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋œ๋‹ค.

let user = { name: "John" };
let admin = user;

admin.name = "Pete";
console.log(user.name);	// "Pete"

user, admin ๋‘˜๋‹ค ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋‹ค.

admin์— ๋ณต์‚ฌ๋œ ๊ฐ’์ด user์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— user, admin์€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.


2. ๊ฐ์ฒด์˜ ๋น„๊ต

๊ฐ์ฒด ๋น„๊ต ์‹œ ๋™๋“ฑ ์—ฐ์‚ฐ์ž(==)์™€ ์ผ์น˜ ์—ฐ์‚ฐ์ž(===)๋Š” ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

let a = {};
let b = a;
let c = {}

console.log(a == b);	// true;
console.log(a === b);	// true;
console.log(a == c);	// false;
  • a๋ฅผ ๋ณต์‚ฌํ•œ b๋Š” a์™€ ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค.
  • a์™€ c๋Š” ๋™์ผํ•œ ๋นˆ ๊ฐ์ฒด์ด์ง€๋งŒ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” ๋…๋ฆฝ๋œ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋‚˜์˜จ๋‹ค.

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

1. for... in ๋ฐ˜๋ณต๋ฌธ

for...in ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ˆœํšŒํ•ด์„œ ์›์‹œ ์ˆ˜์ค€๊นŒ์ง€ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

let user = { name: "John", age: 30 };
let clone = {};

for (let key in user) {
  clone[key] = user[key];
}

 

2. Object.assign()

Object.assign() ๋ฉ”์„œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ : ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ฐ์ฒด
  • ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋ถ€ํ„ฐ : ๋ณต์‚ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด

๋ณต์‚ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋“ค์˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ๋ชฉํ‘œ ๊ฐ์ฒด์— ๋ณต์‚ฌํ•œ๋‹ค.

let user = { name: "John" };
let clone = Object.assign({}, user);

 

์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

let user = { name: "John" };
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };

Object.assign(user, permissions1, permissions2);
// user = { name: "John", canView: true, canEdit: true }

 

  • ๋ชฉํ‘œ ๊ฐ์ฒด์— ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ธฐ์กด ๊ฐ’์ด ๋ฎ์–ด์”Œ์›Œ์ง„๋‹ค.

 

3. ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•

์ „๊ฐœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

let user = { name: "John", age: 30 };
let clone = { ...user };

 

 


4. ๊ฐ์ฒด์˜ ๊นŠ์€ ๋ณต์‚ฌ

์œ„๊นŒ์ง€๋Š” ์›๋ณธ ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์›์‹œ๊ฐ’๋งŒ ์žˆ์—ˆ๋‹ค.

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

let user = {
  name: "John",
  sizes: {
    height: 182,
    width: 50
  }
};
alert( user.sizes.height ); // 182

let clone = Object.assign({}, user);
alert(user.sizes === clone.sizes );	// true

user.sizes.width++;
alert(clone.sizes.width);	// 51

 

์ด๋ ‡๊ฒŒ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ฅผ ํ•  ๋•Œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

1. structuredClone()

structuredClone ํ•จ์ˆ˜๋กœ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

let user = {
  name: "John",
  sizes: { height: 182, width: 50 }
};

// ํ‘œ์ค€ structuredClone API
let clone = structuredClone(user);

console.log(user.sizes === clone.sizes); // false (์™„์ „ ๋…๋ฆฝ)

 

 

2. Ladash

 

Lodash๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

const clone = _.cloneDeep(user);

 

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•