์๋ฐ์คํฌ๋ฆฝํธ์์ ์์๊ฐ(Primitive Values)๊ณผ ์ฐธ์กฐํ(Reference Types)์ ๋์ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ์ด๋ค์ ๋ถ๋ณ์ฑ(Immutability)๊ณผ ๊ฐ๋ณ์ฑ(Mutability)์ ๋ํด ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
์์๊ฐ (Primitive Values)
- ์ ์ : ์์๊ฐ์ ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ undefined, null, boolean, number, bigint, string, symbol์ด ์ด์ ํด๋นํฉ๋๋ค.
- ๋ณต์ ๋ฐฉ์ : ๋ค๋ฅธ ๋ณ์์ ์์๊ฐ์ ๋ณต์ฌํ ๋, ํด๋น ๊ฐ์ด ๊ทธ๋๋ก ๋ณต์ฌ๋์ด ์๋ก์ด ๋ณ์์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ๋ ์ ๊ด์ฌํ์ง ์๊ณ , ๋จ์ํ ๊ฐ๋ง ๋ณต์ฌ๋ฉ๋๋ค.
- ๋ถ๋ณ์ฑ : ์์๊ฐ์ ๋ถ๋ณ๊ฐ์ ๋๋ค. ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ฉด, ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ ์์ ํ๋ ๋์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ก์ด ๊ฐ์ ์ ์ฅํ๊ณ , ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
let a = 10; // a๋ ์ซ์ 10์ ์ ์ฅ let b = a; // b์ a์ ๊ฐ 10์ ๋ณต์ฌ (๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ) console.log(a); // 10 console.log(b); // 10 b = 20; // b์ ์๋ก์ด ๊ฐ 20์ ํ ๋น (์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ฌ์ฉ) console.log(a); // 10 (a๋ ์ฌ์ ํ 10์ ์ฐธ์กฐ) console.log(b); // 20
- b = a๋ฅผ ์คํํ๋ฉด, a์ ๊ฐ 10์ด ๋ณต์ฌ๋์ด b์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ a์ b๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํต๋๋ค.
- b = 20์ผ๋ก ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด, b๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ 20์ ์ ์ฅํ๊ณ ๊ทธ ์ฃผ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. a๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
- ์์๊ฐ์ ๋ถ๋ณ์ ์ด๋ฏ๋ก, a๋ b์ ๊ฐ์ ์ง์ ์์ ํ๋ ๋์ ์๋ก์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํฉ๋๋ค.
์ฐธ์กฐํ (Reference Types)
- ์ ์ : ์ฐธ์กฐํ์ ๊ฐ์ฒด(Object), ๋ฐฐ์ด(Array), ํจ์(Function) ๋ฑ์ผ๋ก, ์ฌ๋ฌ ๊ฐ์ ํ๋์ ๋จ์๋ก ๋ฌถ์ ๋ฐ์ดํฐ ํ์ ์ ๋๋ค.
- ๋ณต์ ๋ฐฉ์ : ์ฐธ์กฐํ์ ๊ฐ์ด ๋ด๊ธด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ณต์ ํฉ๋๋ค. ์ฆ, ๋ณ์๋ ์ค์ ๋ฐ์ดํฐ(๊ฐ์ฒด)๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, ๋ณต์ฌ ์ ์ด ์ฃผ์๋ฅผ ๋ณต์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ๋ณต์ฌ๋ ๋ณ์๋ ์๋ณธ ๊ฐ์ฒด์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- ๊ฐ๋ณ์ฑ : ์ฐธ์กฐํ์ ๊ฐ๋ณ๊ฐ์ ๋๋ค. ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์์ ๊ฐ๋ฅํ๋ฉฐ, ๋ณ์๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ, ๊ฐฑ์ , ์ญ์ ํ ์ ์์ต๋๋ค.
let obj1 = { name: "Alice", age: 25 }; // obj1์ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐ let obj2 = obj1; // obj2๋ obj1๊ณผ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐ console.log(obj1); // { name: "Alice", age: 25 } console.log(obj2); // { name: "Alice", age: 25 } // obj2๋ฅผ ํตํด ๊ฐ์ฒด ์์ obj2.age = 30; obj2.city = "Seoul"; // ๋์ ์ผ๋ก ํ๋กํผํฐ ์ถ๊ฐ console.log(obj1); // { name: "Alice", age: 30, city: "Seoul" } console.log(obj2); // { name: "Alice", age: 30, city: "Seoul" } // ํ๋กํผํฐ ์ญ์ delete obj1.city; console.log(obj1); // { name: "Alice", age: 30 } console.log(obj2); // { name: "Alice", age: 30 }
- obj2 = obj1์ obj1์ด ์ฐธ์กฐํ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ obj2์ ๋ณต์ฌํฉ๋๋ค. ๋ฐ๋ผ์ obj1๊ณผ obj2๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
- obj2.age = 30 ๋๋ obj2.city = "Seoul"๋ก ๊ฐ์ฒด๋ฅผ ์์ ํ๋ฉด, ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๋ obj1์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์๋ฉ๋๋ค.
- ์ฐธ์กฐํ์ ๊ฐ๋ณ์ ์ด๋ฏ๋ก, ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐ(city), ๊ฐฑ์ (age), ์ญ์ (delete obj1.city)ํ ์ ์์ต๋๋ค.
์์๊ฐ vs ์ฐธ์กฐํ ๋น๊ต
ํน์ง | ์์๊ฐ (Primitive) | ์ฐธ์กฐํ (Reference) |
---|---|---|
๋ฐ์ดํฐ ํ์ | number, string, boolean ๋ฑ | object, array, function ๋ฑ |
๋ณต์ ๋ฐฉ์ | ๊ฐ ์์ฒด ๋ณต์ฌ | ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๋ณต์ฌ |
๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ | ๋ถ๋ณ (์๋ก์ด ๊ฐ์ผ๋ก ๊ต์ฒด) | ๊ฐ๋ณ (๊ฐ์ฒด ๋ด๋ถ ์์ ๊ฐ๋ฅ) |
๋ฉ๋ชจ๋ฆฌ ๋์ | ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์์ฑ | ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๊ณต์ |
์์ | let x = 5; x = 10; | let obj = {a: 1}; obj.a = 2; |
์ฐธ์กฐํ์ ๊น์ ๋ณต์ฌ(Deep Copy)
์ฐธ์กฐํ์ ๊ธฐ๋ณธ ๋ณต์ฌ๋ ์์ ๋ณต์ฌ(Shallow Copy)๋ก, ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ๋ณต์ฌํ๋ ค๋ฉด ๊น์ ๋ณต์ฌ๊ฐ ํ์ํฉ๋๋ค.
๐ ์์ ๋ณต์ฌ vs ๊น์ ๋ณต์ฌ
// ์์ ๋ณต์ฌ let original = { name: "Bob", info: { age: 40 } }; let shallowCopy = Object.assign({}, original); shallowCopy.name = "Charlie"; shallowCopy.info.age = 50; console.log(original); // { name: "Bob", info: { age: 50 } } (info๋ ์ฌ์ ํ ๊ณต์ ๋จ) console.log(shallowCopy); // { name: "Charlie", info: { age: 50 } } // ๊น์ ๋ณต์ฌ let deepCopy = JSON.parse(JSON.stringify(original)); deepCopy.name = "David"; deepCopy.info.age = 60; console.log(original); // { name: "Bob", info: { age: 50 } } (๋ณ๊ฒฝ๋์ง ์์) console.log(deepCopy); // { name: "David", info: { age: 60 } }
- ์์ ๋ณต์ฌ(Object.assign)๋ ์ต์์ ํ๋กํผํฐ๋ง ๋ณต์ฌํ๊ณ , ์ค์ฒฉ ๊ฐ์ฒด(info)๋ ์ฌ์ ํ ์๋ณธ๊ณผ ๊ณต์ ๋ฉ๋๋ค.
- ๊น์ ๋ณต์ฌ(JSON.parse(JSON.stringify()))๋ ๊ฐ์ฒด ์ ์ฒด๋ฅผ ์๋ก ์์ฑํ์ฌ ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ ๋ง๋ญ๋๋ค.
๐ ์์๊ฐ ํ์ฉ
function updateScore(score) { score = score + 10; // ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ ์ ์ฅ return score; } let playerScore = 50; console.log(updateScore(playerScore)); // 60 console.log(playerScore); // 50 (์๋ณธ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์)
์์๊ฐ์ ํจ์ ๋ด๋ถ์์ ์์ ํด๋ ์๋ณธ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
๐ ์ฐธ์กฐํ ํ์ฉ
function updateProfile(profile) { profile.age += 1; // ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ profile.city = "Busan"; // ๋์ ํ๋กํผํฐ ์ถ๊ฐ } let user = { name: "Eve", age: 28 }; updateProfile(user); console.log(user); // { name: "Eve", age: 29, city: "Busan" }
์ฐธ์กฐํ์ ํจ์ ๋ด๋ถ์์ ์์ ํ๋ฉด ์๋ณธ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค. user ์๋ณธ ๊ฐ์ฒด๊ฐ { name: "Eve", age: 28 } ์์ { name: "Eve", age: 29, city: "Busan" } ์ผ๋ก ๋ณ๊ฒฝ ๋จ
- ์์๊ฐ: ๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌ, ๋ถ๋ณ, ์ฌํ ๋น ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ฌ์ฉ.
- ์ฐธ์กฐํ: ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ณต์ฌ, ๊ฐ๋ณ, ๊ฐ์ฒด ๋ด๋ถ๋ฅผ ์ง์ ์์ ๊ฐ๋ฅ (ํ๋กํผํฐ ์ถ๊ฐ/๊ฐฑ์ /์ญ์ ).
- ์์๊ฐ์ ๋ ๋ฆฝ์ ์ด๊ณ ์์ ํ์ง๋ง ์์ ์ด ์ ํ์ ์ด๋ฉฐ, ์ฐธ์กฐํ์ ์ ์ฐํ์ง๋ง ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ธํด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
- ๊น์ ๋ณต์ฌ๋ฅผ ํตํด ์ฐธ์กฐํ์ ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊น์ ๋ณต์ฌ(Deep Copy)๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ํฉ์ ๋ฐ๋ผ ๊ฐ๋จํ ๊ฐ์ฒด๋ถํฐ ๋ณต์กํ ๊ฐ์ฒด๊น์ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋์ ๋ํ์ ์ธ ๋ฐฉ๋ฒ๊ณผ ์์ ๋ฅผ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๊ตฌ์กฐ์ ๋ณต์ (Structured Clone)
structuredClone()์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ(Node.js 17+ ๋๋ ์ต์ ๋ธ๋ผ์ฐ์ )์์ ์ ๊ณต๋๋ ๊น์ ๋ณต์ฌ๋ฅผ ์ํ ๋ค์ดํฐ๋ธ ๋ฉ์๋์
๋๋ค. ์ด ๋ฐฉ๋ฒ์ JSON ๋ฐฉ์๋ณด๋ค ๋ ๋ค์ํ ๋ฐ์ดํฐ ํ์
(์: Date, Map, Set ๋ฑ)์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
// ์๋ณธ ๊ฐ์ฒด let original = { name: "Bob", info: { age: 50, date: new Date() }, hobbies: ["reading", "gaming"] }; // ๊น์ ๋ณต์ฌ (structuredClone ์ฌ์ฉ) let deepCopy = structuredClone(original); // ๋ณต์ฌ๋ณธ ์์ deepCopy.name = "David"; deepCopy.info.age = 60; deepCopy.hobbies.push("coding"); console.log(original); // ์ถ๋ ฅ: { name: "Bob", info: { age: 50, date: [Date] }, hobbies: ["reading", "gaming"] } console.log(deepCopy); // ์ถ๋ ฅ: { name: "David", info: { age: 60, date: [Date] }, hobbies: ["reading", "gaming", "coding"] }
- structuredClone()์ ๊ฐ์ฒด์ ๊ทธ ํ์ ๊ตฌ์กฐ๋ฅผ ์์ ํ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณต์ฌํฉ๋๋ค.
- ์๋ณธ ๊ฐ์ฒด์ info.age๋ hobbies ๋ฐฐ์ด์ด ์์ ๋์ง ์์์ ํ์ธํ ์ ์์ต๋๋ค.
- Date ๊ฐ์ฒด๋ ๋ณ๋์ ์ธ์คํด์ค๋ก ๋ณต์ฌ๋๋ฉฐ, JSON ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์์ค ์์ด ๋ณต์ฌ๋ฉ๋๋ค.
๐ ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ ๊น์ ๋ณต์ฌ
์ง์ ๊น์ ๋ณต์ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ฉฐ ๋ณต์ฌํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํ๊ณ , ํน์ ๋ฐ์ดํฐ ํ์
์ ์ถ๊ฐ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
// ๊น์ ๋ณต์ฌ ํจ์ function deepCopy(obj) { // ์์๊ฐ์ด๊ฑฐ๋ null์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ฐํ if (obj === null || typeof obj !== "object") { return obj; } // ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ if (Array.isArray(obj)) { return obj.map(item => deepCopy(item)); } // ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ const copy = {}; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { copy[key] = deepCopy(obj[key]); } } return copy; }
// ์๋ณธ ๊ฐ์ฒด let original = { name: "Bob", info: { age: 50 }, hobbies: ["reading", "gaming"] }; // ๊น์ ๋ณต์ฌ let deepCopy = deepCopy(original); // ๋ณต์ฌ๋ณธ ์์ deepCopy.name = "David"; deepCopy.info.age = 60; deepCopy.hobbies.push("coding"); console.log(original); // ์ถ๋ ฅ: { name: "Bob", info: { age: 50 }, hobbies: ["reading", "gaming"] } console.log(deepCopy); // ์ถ๋ ฅ: { name: "David", info: { age: 60 }, hobbies: ["reading", "gaming", "coding"] }
- deepCopy ํจ์๋ ์ฌ๊ท์ ์ผ๋ก ๊ฐ์ฒด์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
- ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฒ๋ฆฌํ๋ฉฐ, ์์๊ฐ์ ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
- ์ด ๋ฐฉ์์ JSON ๋ฐฉ์์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ , ํจ์๋ undefined ๊ฐ์ ๊ฐ๋ ์ปค์คํฐ๋ง์ด์งํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค(ํ์ ์ ์ถ๊ฐ ๋ก์ง ๊ตฌํ ๊ฐ๋ฅ).
๐ Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ _.cloneDeep
์ค์ ํ๋ก์ ํธ์์๋ Lodash ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. Lodash์ _.cloneDeep ๋ฉ์๋๋ ๊น์ ๋ณต์ฌ๋ฅผ ๊ฐํธํ๊ฒ ์ํํ๋ฉฐ, ๋ค์ํ ๋ฐ์ดํฐ ํ์
์ ์์ ํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
// Lodash๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ (HTML์์๋ CDN ๋๋ ๋ชจ๋๋ก ์ํฌํธ) // ์: <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script> // ์๋ณธ ๊ฐ์ฒด let original = { name: "Bob", info: { age: 50 }, hobbies: ["reading", "gaming"] }; // ๊น์ ๋ณต์ฌ (Lodash ์ฌ์ฉ) let deepCopy = _.cloneDeep(original); // ๋ณต์ฌ๋ณธ ์์ deepCopy.name = "David"; deepCopy.info.age = 60; deepCopy.hobbies.push("coding"); console.log(original); // ์ถ๋ ฅ: { name: "Bob", info: { age: 50 }, hobbies: ["reading", "gaming"] } console.log(deepCopy); // ์ถ๋ ฅ: { name: "David", info: { age: 60 }, hobbies: ["reading", "gaming", "coding"] }
- _.cloneDeep์ Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊น์ ๋ณต์ฌ ๋ฉ์๋๋ก, ๋ณต์กํ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์์ ํ๊ฒ ๋ณต์ฌํฉ๋๋ค.
- JSON ๋ฐฉ์๋ณด๋ค ๋ค์ํ ๋ฐ์ดํฐ ํ์ (์: ํจ์, RegExp, Map)์ ์ง์ํ๋ฉฐ, ์ฑ๋ฅ๋ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ์ค์ ํ๋ก์ ํธ์์ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
๋ฐฉ๋ฒ | ์ฅ์ | ๋จ์ |
---|---|---|
JSON.parse(JSON.stringify()) | ๊ฐ๋จํ๊ณ ๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถํ์ | undefined, ํจ์, Date ๋ฑ ์ผ๋ถ ๋ฐ์ดํฐ ํ์ ์์ค ๊ฐ๋ฅ |
structuredClone() | ๋ค์ดํฐ๋ธ API, ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ง์, ์์ค ์์ | ๋ธ๋ผ์ฐ์ /Node.js ๋ฒ์ ์์กด์ฑ (๊ตฌํ ํ๊ฒฝ์์ ๋์ํ์ง ์์ ์ ์์) |
์ฌ๊ท ํจ์ (deepCopy) | ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ, ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ | ์ง์ ๊ตฌํํด์ผ ํ๋ฉฐ, ๋ณต์กํ ๊ฐ์ฒด์์ ์ฑ๋ฅ ๊ณ ๋ ค ํ์ |
Lodash _.cloneDeep | ์ ๋ขฐ์ฑ ๋์, ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ง์, ํ ์คํธ ์๋ฃ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ์ถ๊ฐ ํ์ |
๐ ๋ณต์กํ ๊ฐ์ฒด(์ค์ฒฉ ๊ฐ์ฒด, ๋ฐฐ์ด, Date, Map ํฌํจ)๋ฅผ ์ฌ์ฉํ ์์
// ์๋ณธ ๊ฐ์ฒด (๋ณต์กํ ๊ตฌ์กฐ) let original = { name: "Bob", info: { age: 50, birthday: new Date("1975-01-01"), address: { city: "Seoul", country: "Korea" } }, hobbies: ["reading", { type: "gaming", level: "pro" }], metadata: new Map([["id", 123], ["active", true]]) }; // ๊น์ ๋ณต์ฌ let deepCopy = structuredClone(original); // ๋ณต์ฌ๋ณธ ์์ deepCopy.name = "David"; deepCopy.info.age = 60; deepCopy.info.address.city = "Busan"; deepCopy.hobbies[1].level = "expert"; deepCopy.metadata.set("id", 456); console.log(original); // ์ถ๋ ฅ: { // name: "Bob", // info: { age: 50, birthday: [Date 1975-01-01], address: { city: "Seoul", country: "Korea" } }, // hobbies: ["reading", { type: "gaming", level: "pro" }], // metadata: Map { "id" => 123, "active" => true } // } console.log(deepCopy); // ์ถ๋ ฅ: { // name: "David", // info: { age: 60, birthday: [Date 1975-01-01], address: { city: "Busan", country: "Korea" } }, // hobbies: ["reading", { type: "gaming", level: "expert" }], // metadata: Map { "id" => 456, "active" => true } // }
- ์ค์ฒฉ ๊ฐ์ฒด(address), ๋ฐฐ์ด ๋ด ๊ฐ์ฒด(hobbies[1]), Date, Map ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ด ํฌํจ๋ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ์ต๋๋ค.
- structuredClone์ ๋ชจ๋ ์์ค์์ ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ ์์ฑํ์ฌ ์๋ณธ์ด ์์ ๋์ง ์์์ ๋ณด์ฌ์ค๋๋ค.