๐ ๊น์๋ณต์ฌ, ์์ ๋ณต์ฌ
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ(์ฃผ์ ๊ฐ)์ ๋ณต์ฌํ๊ณ , ๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์ค์ ๊ฐ์ ๋ณต์ฌํ๋ค.
1. Primitive ํ์ : ๊น์ ๋ณต์ฌ : ์์๊ฐ์ ๊ฐ์ ๋ณต์ฌ ํ ๋ ๋ณต์ฌ๋ ๊ฐ์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น ํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ๊ณผ ๋ณต์ฌ๋ ๊ฐ์ด ์๋ก์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค
let a = 2;
let b = a;
console.log(b); //2
b = 5;
console.log(a); //2
console.log(b); //5 => primitiveํ์
์ ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
2. Object ํ์ : ์์ ๋ณต์ฌ : ์ฐธ์กฐ๊ฐ์ ๋ณ์๊ฐ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๊ฐ(์ฃผ์)๋ฅผ ๋ณต์ฌํ์ฌ ๊ฐ์ ๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. ๋ฐ๋ผ์ ํ์ชฝ์ ๊ฐ์ ๋ณ๊ฒฝ ํ ๊ฒฝ์ฐ, ๊ฐ์ ์ฐธ์กฐ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์์ชฝ ๊ฐ์ด ๋ชจ๋ ๋ณ๊ฒฝ๋๋ค.
const fruit1 = { name: "apple" };
const fruit2 = fruit1;
fruit2.name = "apple";
console.log(fruit1.name); //apple
console.log(fruit2.name); //apple
console.log(fruit1.name === fruit2.name); //true
- ์์ ๋ณต์ฌํ ๋ณ์๋ฅผ ์์ ํ๋ค๋ฉด, ์๋ณธ ๊ฐ์ฒด ๊น์ง ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.
๐์์ ๋ณต์ฌ(Shllow copy)
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ๊ธฐ์กด ๊ฐ๊ณผ ๋ณต์ฌ๋ ๊ฐ์ด ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ์ ๋งํ๋ค.
๊ฐ์ฒด ์์ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ ํ ๊ฐ์ ๊ฐ์ฒด๋ผ๋ ๊ธฐ์กด ๋ณ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ์ด๋ฅผ ์์ ๋ณต์ฌ๋ผ๊ณ ํ๋ค.
=> ๊ฐ์ฒด ์์ฒด๋ ๋ค๋ฅธ ์ ๊ฐ์ฒด์ง๋ง, ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ์ด ํด๋ก ํ ๊ฐ์ฒด ๊ฐ์ ์ฐธ์กฐ๊ฐ์ ๋ณต์ฌํ๋ ๊ฒฝ์ฐ
- 1 ๋ ๋ฒจ(1์ฐจ์ ๋ฐฐ์ด,๊ฐ์ฒด)์ ๋ํด์๋ ๊น์ ๋ณต์ฌ๊ฐ ํ์ฉ๋๋ 2 ๋ ๋ฒจ(2์ฐจ์ ๋ฐฐ์ด)์ด์ ๋ถํฐ๋ ๊น์ ๋ณต์ฌ๊ฐ ๋์ง ์๋๋ค.
1. ๋ฐฐ์ด์ ๋ณต์ฌ : Array.slice(), Array.concat(), Array.from()
๊ธฐ์กด ๋ฐฐ์ด์์ ์ถ์ถํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ๋ฆฌํดํ๋ ๋ฉ์๋๋ค์ด๋ค. 1์ฐจ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๊น์ง๋ ๊น์ ๋ณต์ฌ๊ฐ ํ์ฉ๋๋, 2์ฐจ์ ์ด์ ๋ถํฐ๋ ์์ ๋ณต์ฌํ์ฌ ์๋ณธ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ์ ๋ณต์ฌํ๋ค.
2. Object.assign()
Object.assign(์์ฑํ ๊ฐ์ฒด, ๋ณต์ฌํ ๊ฐ์ฒด)
let user = {
name: "John",
age: 30
};
let clone = Object.assign({}, user);
๋ฉ์๋์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋น ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ๊ณ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณต์ฌํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋ค.
๋ณต์ฌ๋ ๊ฐ์ฒด user2 ์์ฒด๋ ๊ธฐ์กด object์ ๋ค๋ฅธ ์ ๊ฐ์ฒด์ง๋ง ๊ทธ ์์ ๋ค์ด๊ฐ ์๋ ๊ฐ์ ๊ธฐ์กด object์์ ๊ฐ๊ณผ ๊ฐ์ ์ฐธ์กฐ ๊ฐ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค. => ๊ฐ์ฒด ์์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ง๋ง, ๊ฐ์ฒด ์์ ๊ฐ์ ๋ณต์ฌํ ๊ฐ์ฒด ์์ ์ฐธ์กฐ๊ฐ์ ๋ณต์ฌํ๋ค.
3. Spread ์ฐ์ฐ์(...)
๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๋ณต์ฌ์ด๋ค.
const a = { name: "apple", obj: { one: 1, two: 2 }, arr: [1, 2] };
const b = { ...a };
b.name = "ellie";
b.obj.one = 2;
console.log(a.name === b.name); //false
console.log(a.obj.one === b.obj.one); //true => object ํ์
์ ๊ฐ์ ref์ฐธ์กฐ๊ฐ์ด๋ฏ๋ก ๋ณ๊ฒฝ ์ ๊ฐ์ด ๋ณ๊ฒฝ๋จ
โ๏ธ๊น์ ๋ณต์ฌ(Deep copy)
๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ ๊ฐ์ฒด ์์ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ์๋ ์๋ณธ๊ณผ์ ์ฐธ์กฐ๊ฐ ์์ ํ ๋์ด์ง ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
1.JSON.parse && JSON.stringify
JSON.stringify()๋ ๊ฐ์ฒด๋ฅผ json ๋ฌธ์์ด๋ก ๋ณํํ๋๋ฐ ์ด ๊ณผ์ ์์ ์๋ณธ ๊ฐ์ฒด์์ ์ฐธ์กฐ๊ฐ ๋ชจ๋ ๋์ด์ง๋ค. ๊ฐ์ฒด๋ฅผ json ๋ฌธ์์ด๋ก ๋ณํ ํ, JSON.parse()๋ฅผ ์ด์ฉํด ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด)๋ก ๋ง๋ค์ด์ค๋ค.
์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ฝ์ง๋ง 1. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋นํด ๋๋ฆฌ๋ค๋ ๊ฒ๊ณผ 2. ๊ฐ์ฒด๊ฐ ํจ์์ผ ๊ฒฝ์ฐ, undefined๋ก ์ฒ๋ฆฌํ๋ค๋ ๊ฒ, 3. ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋์ง ์๊ฑฐ๋ ํ์ ์ด ๋ณ๊ฒฝ๋๋ ๋ฌธ์ ๊ฐ ์๋ค.(new Date()ํจ์ ๊ฐ์ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ ํ์ ๋ค๋ฆ ๋ฑ)
const a = { name: "apple", obj: { one: 1, two: 2 }, arr: [1, 2] };
const c = JSON.parse(JSON.stringify(a));
c.name = "eliie";
c.obj.one = 3;
c.arr.push(3);
console.log(c);
console.log(a.name === c.name); //false
console.log(a.obj.one === c.obj.one); //false => object ํ์
์ ๊ฐ์ ref์ฐธ์กฐ๊ฐ์ด๋ฏ๋ก ๋ณ๊ฒฝ ์ ๊ฐ์ด ๋ณ๊ฒฝ๋จ
console.log(a.arr === c.arr); //false => object ํ์
์ ๊ฐ์ ref์ฐธ์กฐ๊ฐ์ด๋ฏ๋ก ๋ณ๊ฒฝ ์ ๊ฐ์ด ๋ณ๊ฒฝ๋จ
2. Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๊ณ ์์ ํ๊ฒ ๊น์ ๋ณต์ฌ๋ฅผ ํ ์ ์๋ค. ์ค์น๋ฅผ ํด์ผ ํ๋ค๋ ์ ๊ณผ ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ์๋ ํจ์จ์ ์ด๊ฒ ์ง๋ง, ์ฝ๋ฉ ํ ์คํธ์๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด ๋จ์ ์ด๋ค.
const deepCopy = require("lodash.clonedeep")
const copy = deepCopy(object);
3. ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ผ์ผํ ๋ณต์ฌ, ์ฌ๊ท ํจ์
์ผ์ผํ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ฉฐ ๋ณต์กํ๋ค๋ ๊ฒ์ด ๋จ์ ์ด๋ค.
let user = {
name: "John",
age: 30
};
let clone = {}; // ์๋ก์ด ๋น ๊ฐ์ฒด
// ๋น ๊ฐ์ฒด์ user ํ๋กํผํฐ ์ ๋ถ๋ฅผ ๋ณต์ฌํด ๋ฃ์ต๋๋ค.
for (let key in user) {
clone[key] = user[key];
}
// ์ด์ clone์ ์์ ํ ๋
๋ฆฝ์ ์ธ ๋ณต์ ๋ณธ์ด ๋์์ต๋๋ค.
clone.name = "Pete"; // clone์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
alert( user.name ); // ๊ธฐ์กด ๊ฐ์ฒด์๋ ์ฌ์ ํ John์ด ์์ต๋๋ค.
let origin = {
a: 1,
b: { c: 2 }
};
//๋ฐฉ๋ฒ 1
function isCopyObj(origin) {
let res = {};
for (let key in origin) {
if (typeof origin[key] === 'object') {
res[key] = isCopyObj(obj[key]);
} else {
res[key] = origin[key];
}
}
return res;
}
let copy = isCopyObj(origin);
copy.b.c = 3
console.log(origin.b.c === copy.b.c) //false
// ๋ฐฉ๋ฒ 2
const object = {
a: "a",
number: {
one: 1,
two: 2,
},
arr: [1, 2, [3, 4]],
};
function deepCopy(object) {
if (object === null || typeof object !== "object") {
return object;
}
// ๊ฐ์ฒด์ธ์ง ๋ฐฐ์ด์ธ์ง ํ๋จ
const copy = Array.isArray(object) ? [] : {};
for (let key of Object.keys(object)) {
copy[key] = deepCopy(object[key]);
}
return copy;
}
const copy = deepCopy(object);
copy.number.one = 3;
copy.arr[2].push(5);
console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false
console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }
deepCopy() ํจ์๋ก obj ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ณด๋ธ ๋ค์ ์ธ์๊ฐ์ด ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ์ ๊ทธ๋ฅ obj๋ฅผ ๋ฐํํ๋ฉฐ, ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ๊ฐ ๋งํผ ๋ฃจํ๋ฅผ ๋๊ณ ์ฌ๊ท๋ฅผ ํธ์ถํ์ฌ ๋ณต์ฌ๋ ๊ฐ์ ๋ฐํํ๋ค.
๋ณต์ฌ๋ copyObj ๊ฐ์ฒด๋ฅผ ํ์ธํด๋ณด๋ฉด 2์ฐจ์ ๊ฐ์ฒด์ ๊ฐ๋ ๊น์ ๋ณต์ฌ(Deep Copy)๊ฐ ๋์์ผ๋ฉฐ, ๊ฐ์ฒด์ ํจ์๋ ์ ๋๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
<์ฐธ๊ณ >
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ์คํ์ปจํ ์คํธ(์ค์ฝํ, ๋ณ์, ๊ฐ์ฒด ํธ์ด์คํ ) (0) | 2023.04.05 |
---|---|
๋ฐ์ดํฐ ํ์ ์ฌํ, ๋ฉ๋ชจ๋ฆฌ (0) | 2023.04.04 |
[JavaScript] ๊ฐ์ฒด์ ํ๋กํผํฐ(property) ์ ๊ทผ ๋ฐฉ๋ฒ, ์์ฑ๊ณผ ๋ฉ์๋ ์ฐจ์ด (0) | 2023.02.12 |
[Javascript]์ ๊ทํํ์์ ์ฌ์ฉํ ์ ํจ์ฑ๊ฒ์ฌ (0) | 2022.11.02 |
์๋ฐ์คํฌ๋ฆฝํธ(javaScript)_๋ฆฌํฉํ ๋ง(Refactoring)๋จ๊ณ ์ ๋ฆฌ (0) | 2022.06.08 |