๐ก ์์ ๋ณต์ฌ(shallow copy) vs ๊น์ ๋ณต์ฌ(deep copy)โ๏ธ์์ ๋ณต์ฌ(shallow copy)๋?const obj1 = { a: 1, b: 2}; const obj2 = obj1; console.log( obj1 === obj2 ); // true
const obj1 = { a:1, b:2 }; const obj2 = obj1; obj2.a = 100; console.log( obj1.a ); // 100
โ๏ธ๊น์ ๋ณต์ฌ(deep copy)๋?
๐ ๋ฐฉ๋ฒ 1. โฆ(spread) ์ฐ์ฐ์๋ฅผ ํตํ ๋ณต์ฌ (๊ณผ์ฐ ๊น์ ๋ณต์ฌ๊ฐ ๋ ๊น?)const obj1 = { a:1, b:2 }; const obj2 = { ...obj }; obj2.a = 100; console.log( obj1 === obj2 ) // false console.log( obj1.a ) // 1
๐ ๋ฐฉ๋ฒ 2. Object.assign() ๋ฉ์๋๋ฅผ ํตํ ๋ณต์ฌ (๊ณผ์ฐ ๊น์ ๋ณต์ฌ๊ฐ ๋ ๊น?) Show
Object.assign() - JavaScript | MDN Object.assign() ๋ฉ์๋๋ ์ด๊ฑฐํ ์ ์๋ ํ๋ ์ด์์ ์ถ์ฒ ๊ฐ์ฒด๋ก๋ถํฐ ๋์ ๊ฐ์ฒด๋ก ์์ฑ์ ๋ณต์ฌํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
const obj1 = { a:1, b:2 }; const obj2 = Object.assign({}, obj1); obj2.a = 100; console.log( obj1 === obj2 ) // false console.log( obj1.a ) // 1
โ๏ธ์ฃผ์, ๊น์ ๋ณต์ฌ์ ํจ์ ๐ MDN์ ์ ๊ฐ ๊ตฌ๋ฌธ
๐ โฆ(spread) ์ฐ์ฐ์๋ฅผ ์ด์ฉํด depth 2๊น์ง ๋ณต์ฌํ๋ ๋ฐฉ๋ฒconst obj1 = { a: { b:1, c:1 }, d: 2}; const obj2 = { ...obj1, a:{ ...obj1.a } }; obj1.a.b = 100; console.log(obj1 === obj2) // false console.log(obj2.a.b) // 1 โ๏ธ์๋ฒฝํ Deep copy๋ฅผ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ
Reference์ฐธ๊ณ : [2020.04.26] Javascript ๊น์ ๋ณต์ฌ์ ํจ์ โฆ ๋ชจ๋ฅด๊ณ ์ฌ์ฉํ๋ค ๋คํต์ ๋ง์๋คโฆ ์ฐธ๊ณ : ๊ฐ์ฒด์ ์์ ๋ณต์ฌ vs ๊น์ ๋ณต์ฌ ์ฐธ๊ณ : [JavaScript] ์์ ๋ณต์ฌ(Shallow Copy)์ ๊น์ ๋ณต์ฌ(Deep Copy) ์ฐธ๊ณ : ์์ ๋ณต์ฌ(shallow copy) vs ๊น์ ๋ณต์ฌ(deep copy) ์ฐธ๊ณ : ๐ฏ ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ โ 01 ๋ฐ์ดํฐ ํ์ ์ฐธ๊ณ : Copying Objects in JavaScript | DigitalOcean ์ฌ์ด๋ ํ๋ก์ ํธ ์งํ ์ค, ๋ด๊ฒ ์์ฒญ๋๊ฒ ์คํธ๋ ์ค๋ฅผ ์๊ฒจ์ค ์์๊ฐ ์์๋ค. Javascript์ ๊น์ ๋ณต์ฌ์ ํจ์ .. ์ฐ์ ์ด ๊น์ ๋ณต์ฌ์ ํจ์ ์ ์ค๋ช ํ๊ธฐ ์ํด์, Object ๋ณต์ฌ์ ๊ฐ๋ ์ ๋ํด ๊ฐ๋จํ ์ค๋ช ์ ํด๋ณด๋ ค๊ณ ํ๋ค. ์์ ๋ณต์ฌ(Shallow copy)์ฐ๋ฆฌ๊ฐ ํํ ์๊ณ ์๋ฏ์ด, ๊ฐ์ฒด๊ฐ ๋ด๊ฒจ์๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด call by reference (๋ฐ์ดํฐ ๋ณต์ฌ๊ฐ ์๋ ์ฐธ์กฐ)๊ฐ ์ผ์ด๋๊ฒ ๋์ด, ํ ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ๋ณ์์ ๋ฐ์ดํฐ๋ ํจ๊ป ๋ณ๊ฒฝ์ด ๋๋ค.
๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ํ๋ ๋ ์์ฑ๋ ๊ฒ์ด ์๋ ํด๋น ๋ฐ์ดํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ฌํ๊ฒ ๋ผ์, ๊ฒฐ๊ตญ ํ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ๊น์ ๋ณต์ฌ(Depth copy)ํ ๋ฐ์ดํฐ์ ๊ณต์ ๊ฐ ์๋, ๋๊ฐ์ ๊ตฌ์กฐ์ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ ์์ฑํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ๊ณ ์ ํ ๋๊ฐ ์๋ค. ์ด๋ด ๋ ์ฐ๋ฆฌ๋ '๊น์ ๋ณต์ฌ'๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
๋ฐ์ดํฐ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๊ฒ ํจ์ผ๋ก์จ, ํ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฐ์ดํฐ์๋ ์ํฅ์ด ์๊ฒ ๋๋ค. ๊น์ ๋ณต์ฌ(Depth copy)๋ฅผ ํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒObject.assign()Object.assign()์ ES6์ธ๊ฐ ES7์ธ๊ฐ...Object ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ณํฉํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์์ด๋ค.
๋น Object์๋ค๊ฐ ๋ณต์ฌ๋ฅผ ํ๋ ค๋ Object๋ฅผ ๋ณํฉํ๋ค. ๊ทธ๋ฌ๋ฉด ํํ๋ originObj์ด์ง๋ง ์ค์ ๋ก๋ ๋น Object์ originObj๊ฐ ๋ณํฉ๋ ์๋ก์ด Object๊ฐ ๋ฐํ๋๋ค. ์ ๊ฐ ์ฐ์ฐ์ (Spread Operation)ES6์์ ์๋กญ๊ฒ ์ถ๊ฐ๋ Javascript ๋ฌธ๋ฒ์ด๋ค.
...(์ฉ์ฉ์ฉ)์ ์ด์ฉํ์ฌ, ๋ฐฐ์ด์ด๋ Object ํํ์ ๊ดํธ๋ฅผ ์ด์ฉํ์ฌ ํ์ด์(?) ์ฌ์ฉํด๋ฒ๋ฆฌ๋ ๋ฐฉ์์ด๋ค. Object ๋ฟ ์๋๋ผ, ๋ฐฐ์ด๋ ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ๊น์ ๋ณต์ฌ๋ฅผ ํ๋ ค๋ฉด, ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ๊น์ ๋ณต์ฌ๋ฅผ ์จ์ ํ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ค๊ฐ ๋คํต์ ๋ง๋๋ค... ์๋ํ๋ฉด, ์ด ๊น์ ๋ณต์ฌ๋ ํ์ฌ์ Depth ์ด์์ผ๋ก๋ ๊น์ ๋ณต์ฌ๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊น์ ๋ณต์ฌ(Depth copy)์ ํจ์ ์์๋ฅผ ๋ค์ด์ ๋ณด๋๋ก ํ์.
Depth๊ฐ 2์ธ Object๋ฅผ ์ ๊ฐ์ฐ์ฌ์๋ฅผ ์ด์ฉํ์ฌ Obj2 ๋ณ์์ ํ ๋นํ๋ค. ํ์ธํด๋ณด๋ฉด Obj1๊ณผ Obj2๋ ํํ๊ฐ ๋๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ === ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ํ์ธํด๋ณด๋ฉด, ๊ฐ์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ก ์ ๋๋ก ๊น์ ๋ณต์ฌ๊ฐ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ๊ทธ๋ฌ๋ ๊น์ ๋ณต์ฌ๊ฐ ๋ ๊ฒ์ ์ ์ผ ๋ฐ๊นฅ์ Depth๋ฟ์ด๋ค.
๋ ๋ฒ์งธ Depth ์ด์์ ์์๋ค์ ์ฐธ์กฐ ๊ฐ์ ์ ๋ฌํ๋... ์ฆ, ์์ ๋ณต์ฌ(Shallow copy)๋ฅผ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์๋ฒฝํ ๊น์ ๋ณต์ฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ฌ๊ท์ ์ผ๋ก ๊น์ ๋ณต์ฌ๋ฅผ ์ํ๊น์ ๋ณต์ฌ๋ฅผ ํ๋ ค๋ ํํ์ ๋ง๊ฒ ์ฌ๊ท ํจ์๋ฅผ ๋ง๋ค์ด์ ๋ณต์ฌ๋ฅผ ํด์ผํ๋ค. ์ฌ๊ฐ ๊ท์ฐฎ์ ์ผ์ด ์๋๋ค... ์ฌ์ฉํ๋ Object์ Depth๊ฐ ๊ธธ์ด์ง์๋ก Time Complexity(์๊ฐ ๋ณต์ก๋)๋ ๋์ด๋๊ฒ ๋๋ค. Lodash์ cloneDeep ํจ์ ์ฌ์ฉ์๋ฐ์คํฌ๋ฆฝํธ ๊ณ ์ฐจํจ์ ์งํฉ ๋ฐ ํจ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. Lodash์ cloneDeep ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ์๋ฒฝํ๊ฒ ๊น์ ๋ณต์ฌ๋ฅผ ํ ์ ์๋ค. JSON.parse()์ JSON.stringify()ํจ์ ์ฌ์ฉJSON.stringify ํจ์๋ฅผ ์ด์ฉํด์, Object ์ ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ณํ ํ, ๋ค์ JSON.parse ํจ์๋ฅผ ์ด์ฉํด์ ๋ฌธ์์ด์ Object ํํ๋ก ๋ณํํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ฌธ์์ด๋ก ๋ณํํ๋ ์๊ฐ ์ฐธ์กฐ ๊ฐ์ด ๋๊ธฐ๊ธฐ ๋๋ฌธ์ ์๋ก์ด Object๋ก ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง JSON ํจ์๋ ์์ฒญ๋๊ฒ ๋ฆฌ์์ค๋ฅผ ์ก์๋จน๋ ํจ์์ธ ๋งํผ, ์ฑ๋ฅ์ด ์ข์ง ์์ ๋ถ๋ถ์ ๊ณ ๋ คํด์ผ ํ๋ค. ๋๋ ์ด ํจ์ ์ผ๋ก ์ธํด, ๋ฐ๋์ ์ด๋ ์๊ฐ์ ํํฉ ์์ด ๋ฒ๋ฆฌ๊ณ ๋ง์๋ค... ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง๋ ์์๋๋ฐ ๋ง์๋๋ก ๋ณ๊ฒฝ์ด ๋์ด ์๊ณ , ๊ทธ ์์ธ์ ๋น์ต ์ฐพ์๋ด๋ ์ ์๊ฐ ์์๋ค. ์ด ๊น์ ๋ณต์ฌ๋ฅผ ๊ตณ๊ฒ ๋ฏฟ์๊ธฐ ๋๋ฌธ์... |