[🐱 μžλ°”μŠ€ν¬λ¦½νŠΈ] κΉŠμ€ 볡사(Deep Copy) / 얕은 볡사(Shallow Copy)

dsfasdΒ·2022λ…„ 9μ›” 21일
0

μžλ°”μŠ€ν¬λ¦½νŠΈ κΉŠμ€ 볡사 / 얕은 볡사

κΉŠμ€ 볡사와 얕은 볡사

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” 볡사 λ°©μ‹μœΌλ‘œ 얕은 볡사와 κΉŠμ€ 볡사가 μžˆλ‹€.

얕은 λ³΅μ‚¬λŠ” 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” μ£Όμ†Œ 값을 λ³΅μ‚¬ν•˜κ³ ,
κΉŠμ€ λ³΅μ‚¬λŠ” 객체의 μ‹€μ œ 값을 λ³΅μ‚¬ν•œλ‹€.

μ΄λŸ¬ν•œ λ°©μ‹μ˜ μ°¨μ΄λŠ” λ°μ΄ν„°μ˜ μ’…λ₯˜μ— 따라 μ €μž₯ν•˜λŠ” 방식이 달라지기 λ•Œλ¬Έμ΄λ‹€.
μ•„λž˜ λ°μ΄ν„°μ˜ μ’…λ₯˜λ₯Ό ν™•μΈν•΄λ³΄μž.


μžλ°”μŠ€ν¬λ¦½νŠΈ μ›μ‹œ νƒ€μž… 데이터 / μ°Έμ‘° νƒ€μž… λ°μ΄ν„°μ˜ λ‹€λ₯Έ μ €μž₯ 방식

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°μ΄ν„°λŠ” μ›μ‹œ νƒ€μž… 데이터와 μ°Έμ‘° νƒ€μž… 데이터가 μ‘΄μž¬ν•œλ‹€.

μ›μ‹œνƒ€μž… 데이터 : number, string, null, undefined, bool, symbol
μ°Έμ‘° νƒ€μž… 데이터 : array, object, function

🍎 μ›μ‹œνƒ€μž… 데이터

μ›μ‹œνƒ€μž… 데이터 λŠ” μž…λ ₯ 받은 값을 직접 μŠ€νƒ λ©”λͺ¨λ¦¬ 에 μ €μž₯ν•˜λŠ” 방식이닀.
λ”°λΌμ„œ μž¬ν• λ‹Ήμ˜ 경우, λ°”λ‘œ λ°μ΄ν„°μ˜ 값이 λ³€ν•œλ‹€. 즉, μ›μ‹œνƒ€μž… λ°μ΄ν„°λŠ” κΉŠμ€ 볡사 만 κ°€λŠ₯ν•œ μ…ˆμ΄λ‹€.

🍎 μ°Έμ‘°νƒ€μž… 데이터

λ°˜λ©΄μ— μ°Έμ‘°νƒ€μž… 데이터 λŠ” μ €μž₯ν•˜λŠ” 방식이 살짝 λ‹€λ₯΄λ‹€. ν• λ‹Ήν•œ κ°’μ˜ μ£Όμ†Œ λ₯Ό μŠ€νƒ λ©”λͺ¨λ¦¬ 에 μ €μž₯ν•œλ‹€. 그리고 μ‹€μ œ 데이터 의 값은 νž™ μ΄λΌλŠ” λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯ν•΄λ‘”λ‹€.

μ΄λŠ” μ°Έμ‘° νƒ€μž… 데이터(객체, λ°°μ—΄)의 변경에 따라 λ‹¬λΌμ§€λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ˜ μ‚¬μš©μ„ μœ μ—°ν•˜κ²Œ ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

πŸ—― μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— <λ°°μ—΄ / 객체을 μ €μž₯ν•œ λ³€μˆ˜>λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— μ„ μ–Έν•˜μ—¬ λ³΅μ‚¬ν•˜λŠ” 경우 <λ™μΌν•œ μ£Όμ†Œκ°’μ„ 볡사>ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ <λ™μ‹œμ— 두 λ³€μˆ˜μ—μ„œ λ°°μ—΄ / 객체의 μˆ˜μ •> 이 이뀄진닀.

μ°Έμ‘° νƒ€μž… λ°μ΄ν„°μ˜ 얕은 볡사

μ°Έμ‘° νƒ€μž… 데이터 값을 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ μ§μ ‘μ μœΌλ‘œ 값을 μΆ”κ°€ 및 μˆ˜μ •ν•œλ‹€λŠ” 것은 μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ 얕은 볡사 에 ν•΄λ‹Ήν•œλ‹€.

μ°Έμ‘° νƒ€μž… λ°μ΄ν„°μ˜ κΉŠμ€ 볡사

ν•˜μ§€λ§Œ μ°Έμ‘° νƒ€μž… 데이터 λ˜ν•œ κΉŠμ€ 볡사 κ°€ κ°€λŠ₯ν•˜λ‹€.
λ°”λ‘œ JSON.parse 와 JSON.stringify λ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.


κΉŠμ€ 볡사λ₯Ό μœ„ν•œ JSON.stringify, JSON.parse λ©”μ„œλ“œ

const newArr = JSON.parse(JSON.stringify(arr))

arr λ°°μ—΄μ˜ κ°’κΉŒμ§€ λ³΅μ‚¬ν•˜μ—¬ newArr에 μƒˆλ‘œ ν• λ‹Ήν•΄μ£Όμ—ˆλ‹€.

  • JSON.stringify()Β λ©”μ„œλ“œλŠ” JavaScript κ°’μ΄λ‚˜ 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜
  • JSON.parse() λ©”μ„œλ“œλŠ” JSON λ¬Έμžμ—΄μ˜ ꡬ문을 λΆ„μ„ν•˜κ³ , κ·Έ κ²°κ³Όμ—μ„œ JavaScript κ°’μ΄λ‚˜ 객체λ₯Ό 생성

-> ν•˜μ§€λ§Œ JSON.stringify, JSON.parseλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 μ„±λŠ₯이 느리고
ν•¨μˆ˜ Math, date 같은 λ‚΄μž₯ 객체 볡사λ₯Ό ν•  수 μ—†μœΌλ―€λ‘œ μ‚¬μš©μ„ μ§€μ–‘ν•˜λŠ” 것이 μ’‹λ‹€.


κ°€μž₯ 효율적인 볡사 방식은 λ¬΄μ—‡μΌκΉŒ?

βœ… μ „κ°œ μ—°μ‚°μž (spread 문법) 을 ν†΅ν•œ 얕은 볡사

ex. const newArr = [...arr]

βœ… lodash 라이브러리의 ν™œμš©

lodash λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ°°μ—΄, 숫자, 객체, λ¬Έμžμ—΄ 등을 닀루기 μœ„ν•œ λ‹€μ–‘ν•œ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€.

profile
기둝을 μ •λ¦¬ν•˜λŠ” 곡간!

0개의 λŒ“κΈ€