๐ ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ค? ํจ์๋ ์๊ณ ๋ฆฌ์ฆ์ด ์๊ธฐ ์์ ์ ํธ์ถํด ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๋ ๊ฒ
๋ฐ์ดํฐํ์ ์ ๊ธฐ๋ณธ ์ค๋ช
[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;
}