๋ถ๋ณ๊ฐ์ฒด(Immutable Object )
๐ ๋ถ๋ณ ๊ฐ์ฒด๋?
๋ณ์์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋๋ผ๋, ๊ฐ์ฒด์ ์ฃผ์๊ฐ ๋ณํ์ง ์๋ ๊ฐ์ฒด
๋ถ๋ณ์ฑ ์ฌ๋ถ๋ฅผ ๊ตฌ๋ถํ ๋์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๋์์ ๋ฐ์ดํฐ ์์ญ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ ์ธ์ ํ์ํ ๊น?
๋ชจ๋ ์ฐธ์กฐํ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ณ์ฑ์ ๋ ๋ ๊ฒ์ ์๋๋๋ค.
์ฐธ์กฐํ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ณ์ฑ์ ๊ฐ์ง ๋๋ ๋ฐ์ดํฐ ์์ฒด๊ฐ ์๋ ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ณ์๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ์ํฉ์์ ๊ฐ์ผ๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๊ฐํ๋๋ผ๋ ์๋ณธ ๊ฐ์ฒด๋ ๋ณํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ์ ๋ถ๋ณ๊ฐ์ฒด๊ฐ ํ์ํฉ๋๋ค.
var user = {
name: "Jaenam",
gender: "male",
};
var chanegeName = function (user, newName) {
var newUser = user;
newUser.name = newName;
return newUser;
};
var user2 = chanegeName(user, "Jung");
if (user !== user2) {
console.log("์ ์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค."); // ์คํ๋์ง ์์
}
console.log(user.name, user2.name);
console.log(user === user2);
๊ฒฐ๊ณผ
Jung Jung
true
user
๊ณผ newUser
์ด ๊ฐ์ ๋ฐ์ดํฐ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์ด newUser
์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค user
์ ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋ฉ๋๋ค.
๋ฐ๋ผ์ user
๋ฅผ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ค ํ์์ฑ์ด ๋ณด์
๋๋ค.
๐ ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ
1. ์์ ๋ณต์ฌ
์ค์ฒฉ๋ ๊ฐ์ฒด์์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํ ๋ ๊ทธ ์ฃผ์๊ฐ๋ง ๋ณต์ฌํฉ๋๋ค.
์์ ๋ณต์ฌ๋ฅผ ํ๋ฉด ํด๋น ํ๋กํผํฐ์ ๋ํ ์๋ณธ๊ณผ ์ฌ๋ณธ์ด ๋ชจ๋ ๋์ผํ ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ์ฌ๋ณธ์ ๋ฐ๊พธ๋ฉด ์๋ณธ์ด ๋ฐ๋๊ณ ์๋ณธ์ ๋ฐ๊พธ๋ฉด ์ฌ๋ณธ์ด ๋ฐ๋๋ ํ์์ด ์ผ์ด๋ฉ๋๋ค.
var copyObject = function (target) {
var result = {};
for (var prop in target) {
result[prop] = target[prop];
}
return result;
};
var user = {
name: "Jaenam",
urls: {
portfolio: "http://github.com/abc",
blog: "http://blog.com",
facebood: "http://facebook.com/abc",
},
};
var user2 = copyObject(user);
user.name = "Jung";
console.log(user.name === user2.name); //false
user.urls.portfolio = "http://portfolio.com";
console.log(user.urls.portfolio === user2.urls.portfolio); // true
user2.urls.blog = "";
console.log(user.urls.blog === user2.urls.blog); //true
๊ฒฐ๊ณผ
false
true
true
user
๊ฐ์ฒด์ ์ง์ ์ํ ํ๋กํผํฐ์ ๋ํด์๋ ๋ณต์ฌํด์ ์์ ํ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ง๋ค์ด์ง ๋ฐ๋ฉด, ํ ๋จ๊ณ ๋ ๋ค์ด๊ฐ urls
์ ๋ด๋ถ ํ๋กํผํฐ๋ค์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค..
user.urls
์ ํ๋กํผํฐ์ ๋ํด์๋ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค ํ์์ฑ์ด ์๊ฒผ์ต๋๋ค.
๊น์ ๋ณต์ฌ
๊น์ ๋ณต์ฌ๋ ์์ ๋ณต์ฌ์์ ํ ๋จ๊ณ ๋ ๋ณต์ฌ๋ฅผ ํ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฒด์ ํ๋กํผํฐ ์ค์์ ๊ทธ ๊ฐ์ด ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ผ ๊ฒฝ์ฐ์๋ ๊ทธ๋๋ก ๋ณต์ฌํ๊ณ , ์ฐธ์กฐํ ๋ฐ์ดํฐ์๋ ๋ค์ ๊ทธ ๋ด๋ถ์ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
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;
};
target
์ด ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ์ํํ์ฌ copyObjectDeep
ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๊ณ , ์๋ณธ๊ณผ ์ฌ๋ณธ์ด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
์ถ์ฒ
- ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ
๐ฌ ์ต์ ๋๊ธ