๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT

JavaScript Shallow Copy์™€ Deep Copy: ๊ฐœ๋…, ํ™œ์šฉ, ์žฅ๋‹จ์ 

by ๐Ÿ’ฒ๐ŸŽตโœ–๏ธโœ”๏ธโ˜ผ 2024. 3. 12.
728x90

JavaScript Shallow Copy์™€ Deep Copy: ๊ฐœ๋…, ํ™œ์šฉ, ์žฅ๋‹จ์ 

1. Shallow Copy์™€ Deep Copy๋ž€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•  ๋•Œ, Shallow Copy์™€ Deep Copy๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š”ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • Shallow Copy(์–•์€ ๋ณต์‚ฌ): ๊ธฐ์กด ๊ฐ์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • Deep Copy(๊นŠ์€ ๋ณต์‚ฌ): ๊ฐ์ฒด์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์— ๋Œ€ํ•ด ์™„์ „ํ•œ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋Š” ๊ธฐ์กด ๊ฐ์ฒด์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

2. Shallow Copy์™€ Deep Copy์˜ ์—ญํ• 

  • Shallow Copy: ๊ฐ์ฒด์˜ ์ผ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ๋ณต์‚ฌ๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๋ถ€ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์€ ๊ณต์œ ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Deep Copy: ์™„์ „ํ•œ ๋…๋ฆฝ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ๋‚ด๋ถ€ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณต์‚ฌ ๊ณผ์ •์ด ๋ณต์žกํ•˜๊ณ  ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์–ด๋Š ์ƒํ™ฉ์— Shallow Copy์™€ Deep Copy๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

  • Shallow Copy: ๋‚ด๋ถ€ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์ด ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ณต์‚ฌ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.
  • Deep Copy: ๋‚ด๋ถ€ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณต์‚ฌ ์†๋„๊ฐ€ ๋Š๋ ค๋„ ์ƒ๊ด€์—†๋Š” ๊ฒฝ์šฐ, ์™„์ „ํ•œ ๊ฐ์ฒด ๋…๋ฆฝ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ.

4. Shallow Copy์™€ Deep Copy์˜ ์žฅ๋‹จ์ 

Shallow Copy์˜ ์žฅ๋‹จ์ :

์žฅ์ :

  • ๋ณต์‚ฌ ์†๋„: ๋ ˆํผ๋Ÿฐ์Šค๋งŒ์„ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๋‹จ์ :

  • ๋‚ด๋ถ€ ๊ฐ์ฒด ๊ณต์œ : ๋‚ด๋ถ€ ๊ฐ์ฒด๋Š” ์—ฌ์ „ํžˆ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝ์ด ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Deep Copy์˜ ์žฅ๋‹จ์ :

์žฅ์ :

  • ์™„์ „ํ•œ ๋…๋ฆฝ์„ฑ: ๋‚ด๋ถ€ ๊ฐ์ฒด์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ ๋ณ€๊ฒฝ์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹จ์ :

  • ๋ณต์‚ฌ ์†๋„: ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: Shallow Copy์— ๋น„ํ•ด ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. Shallow Copy์™€ Deep Copy๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ ์ฝ”๋“œ

Shallow Copy ์˜ˆ์ œ

const originalArray = [1, 2, { a: 3 }];
const shallowCopyArray = [...originalArray];
shallowCopyArray[2].a = 99;

console.log(originalArray); // [1, 2, { a: 99 }]

Deep Copy ์˜ˆ์ œ

const originalObject = { x: 1, y: { z: 2 } };
const deepCopyObject = JSON.parse(JSON.stringify(originalObject));
deepCopyObject.y.z = 99;

console.log(originalObject); // { x: 1, y: { z: 2 } }

6. ์—ฐ๊ด€๋œ ๊ธฐ์ˆ 

  • Immutable.js: ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
  • Lodash: ๋‹ค์–‘ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, _.cloneDeep ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Shallow Copy์™€ Deep Copy๋Š” ๊ฐ์ฒด ๋ฐ ๋ฐฐ์—ด ๋ณต์‚ฌ ์‹œ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€