λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸ“Ί Front End/- HTML,css,Javascript

[Javascript-Core] μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 얕은 볡사(Shallow Copy)와 κΉŠμ€ 볡사(Deep Copy)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

by Wonit 2020. 7. 31.

였늘 μ•Œμ•„λ³Ό 것은 얕은 볡사(Shallow Copy)와 κΉŠμ€ 볡사(Deep Copy)이닀.

 

μš°μ„  얕은 볡사(Shallow Copy)와 κΉŠμ€ 볡사(Deep Copy)λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ›μ‹œ νƒ€μž…(Primitive Type), μ°Έμ‘° νƒ€μž…(Reference Type)에 λŒ€ν•΄μ„œ μ•Œμ•„μ•Ό ν•œλ‹€.

 

사싀상 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν•™μŠ΅ν•˜λ©° κΉŠμ€ 볡사와 얕은 볡사λ₯Ό ν•™μŠ΅ν•˜κΈ° μœ„ν•΄ λ‚΄ λΈ”λ‘œκ·Έλ₯Ό 검색을 톡해 λ“€μ–΄μ˜¬ μ‚¬λžŒλ“€μ΄λΌλ©΄ μ›μ‹œ νƒ€μž…κ³Ό μ°Έμ‘° νƒ€μž…μ— λŒ€ν•΄μ„œ λͺ¨λ₯Ό μ‚¬λžŒμ€ μ—†λ‹€κ³  μƒκ°ν•˜κ³  그에 λŒ€ν•œ κΉŠμ€ λ‚΄μš©μ€ μƒλž΅ν•˜κ² λ‹€.

 

ν•˜μ§€λ§Œ μ—¬λŸ¬ μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ…μ„ ν•™μŠ΅ν•˜κ³  μžˆλŠ” 상황이라면 머릿속이 μ•„μ£Ό ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆμœΌλ―€λ‘œ κ°€λ³κ²Œ ν•œ 번 짚고 λ„˜μ–΄κ°€ 보자.


Primitive Type

μ›μ‹œ νƒ€μž…μ€

  • Number
  • String
  • Boolean
  • Null
  • undefined

그리고 μΆ”κ°€μ μœΌλ‘œ ES6μ—μ„œ μΆ”κ°€λœ Symbol() νƒ€μž…μ΄ μ‘΄μž¬ν•œλ‹€.

 

이런 μ›μ‹œ νƒ€μž…μ˜ νŠΉμ§•μ€ Immutableμ΄λΌλŠ” 것인데 μžμ„Έν•œ λ‚΄μš©μ€ PoiemWeb-Immutableμ—μ„œ ν™•μΈν•˜λŠ” 게 λΉ λ₯Ό 것 κ°™μ•„μ„œ μƒλž΅ν–ˆκ³ , μš°λ¦¬κ°€ 값을 λ³΅μ‚¬ν•œλ‹€λ©΄ Pass By Value ν˜•νƒœλ‘œ 단지 κ°’λ§Œ λ³΅μ‚¬λœλ‹€.

 

μ½”λ“œμ™€ μ½˜μ†” κ²°κ³Ό

μ΄λŸ¬ν•œ μ½”λ“œκ°€ μžˆμ„ λ•Œ μš°λ¦¬κ°€ μž„μ˜μ μœΌλ‘œ car = 2라고 값을 λ³€κ²½ν•œλ‹€λ©΄ 각자 μ„œλ‘œ λ‹€λ₯Έ 값을 μœ μ§€ν•  수 있게 λœλ‹€.

 

 

Reference Type

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ°Έμ‘° νƒ€μž… 같은 κ²½μš°λŠ”

  • 객체
  • λ°°μ—΄
  • ν•¨μˆ˜

등이 λŒ€ν‘œμ μΈ μ°Έμ‘° νƒ€μž…μœΌλ‘œ λΆˆλ €μ§„λ‹€.

 

이런 μ°Έμ‘° νƒ€μž…μ€ 값이 볡사가 λ˜λŠ” 게 μ•„λ‹ˆλΌ ν•΄λ‹Ή 객체가 μ°Έμ‘°ν•˜λŠ” μ£Όμ†Œκ°€ λ³΅μ‚¬λΌμ„œ λ‹€λ₯Έ μ°Έμ‘° λ³€μˆ˜(car, bike)라고 ν•˜λ”λΌλ„ μ„œλ‘œ 같은 곳을 가리킀며 κ²°κ΅­ λ‘˜ 쀑 ν•˜λ‚˜μ˜ μ°Έμ‘° λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ 값을 λ³€κ²½ν•˜κ²Œ 되면 μ„œλ‘œ 같은 μ£Όμ†Œλ₯Ό κ³΅μœ ν•˜λ―€λ‘œ λ³€κ²½λ˜λŠ” 값은 κ°™μ•„μ§€κ²Œ λœλ‹€.

 


이제 기본적으둜 μ•Œμ•„μ•Ό ν•  뢀뢄에 λŒ€ν•΄μ„œλŠ” μ•Œμ•˜μœΌλ‹ˆ 본둠인 얕은 볡사(Shallow Copy)와 κΉŠμ€ 볡사(Deep Copy)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.


그전에

이게 μ™œ ν•„μš”ν•œλ°?

에 λŒ€ν•œ 닡을 κ°„λ‹¨ν•˜κ²Œ μ œμ‹œλ₯Ό ν•΄μ£Όμžλ©΄


μš°λ¦¬κ°€ 얕은 볡사와 κΉŠμ€ 볡사에 λŒ€ν•΄μ„œ μ•Œκ²Œ 되면, 볡사 μ‹œμ μ— ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ˜ 속성과 λͺ¨λ‘ λ™μΌν•œ 객체λ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•˜μ§€λ§Œ, μ„œλ‘œ λ‹€λ₯Έ(κ³΅μœ ν•˜μ§€ μ•ŠλŠ”) 값을 κ°–κ²Œ ν•  수 μžˆλŠ” 게 λ°”λ‘œ 우리의 λͺ©ν‘œμ΄λ‹€.

λ¨Όμ € 결둠을 μ•Œλ €μ€„κ²Œ

얕은 볡사 : λ°”λ‘œ μ•„λž«λ‹¨κ³„μ˜ κ°’λ§Œ 볡사
κΉŠμ€ 볡사 : 내뢀에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  κ°’ 볡사.

 

이런 νŠΉμ§•μ„ κ°–λŠ”λ‹€λŠ” κ±Έ λ¨Όμ € μΊμΉ˜ν•˜κ³  μ•„λž˜μ˜ μ„€λͺ…을 보면 이해가 μ’€ 더 λΉ λ₯΄κ²Œ 될 수 μžˆλ‹€.

얕은 볡사 (Shallow Copy)

μš°λ¦¬λŠ” μ„œλ‘œ κ³΅μœ λ˜λŠ” 값을 κ±°λΆ€ν•˜κ³  각각의 값을 λ…λ¦½μ μœΌλ‘œ κ°–κ²Œ ν•˜κ³  싢은 것이닀.

 

그럼 독립적은 값을 κ°–κ²Œ ν•˜κ³  μ‹ΆμœΌλ©΄ 각각의 킀와 값을 μƒˆλ‘œμš΄ 객체의 μ›μ†Œλ‘œ 전해쀄 수 있으면 λ˜μ§€ μ•Šμ„κΉŒ?λΌλŠ” μƒκ°μ—μ„œλΆ€ν„° μΆœλ°œν•œλ‹€.

볡사 ν•˜κΈ°

그럼 킀와 값을 각각으둜 μ΄ν„°λ ˆμ΄μ…˜μ„ 돌리면 λ˜μ§€ μ•Šμ„κΉŒ?

 

μ΄ν„°λ ˆμ΄μ…˜μ€ 각각의 μ›μ†Œλ₯Ό ν•˜λ‚˜ν•˜λ‚˜ ν™•μΈν•˜λŠ” 방법을 λ§ν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ— Iterator 역할을 ν•˜λŠ” 방법은 크게 2가지가 μžˆλŠ”λ° map()μ΄λ‚˜ forEachλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

 

λ§Œμ•½ μš°λ¦¬μ—κ²Œ

let car = {
    wheel: 4,
    engine: 2,
    color: {
        sheet: 'brown',
        handle: 'black',
        outlook: 'white',
    }
}

λΌλŠ” 객체가 μžˆμ„ λ•Œ, μš°μ„  ν•˜λ‚˜ ν•˜λ‚˜ keyλ₯Ό 뽑아야 ν•œλ‹€.


그리고 κ·Έ key에 ν•΄λ‹Ήν•˜λŠ” 값을 Object.key()둜 λ½‘μ•„μ˜¬ 수 μžˆλŠ”λ° κ·Έ λ°˜ν™˜μ„ λ°°μ—΄λ‘œ ν•œλ‹€.


그럼 κ·Έ 배열을 μƒˆλ‘œμš΄ 객체에 μ „ν•΄μ£Όλ©΄ 볡사가 μ™„λ£Œλœλ‹€.

μ§œμž”.

 

ν•˜μ§€λ§Œ λ¬Έμ œκ°€ 생긴닀.

 

λ§Œμ•½ 객체의 ν”„λ‘œνΌν‹°κ°€ 객체라면??

λ³΅μ‚¬κΉŒμ§€λŠ” 잘 λ˜λŠ”λ°, μ–΄μ°¨ν”Ό 내뢀에 μžˆλŠ” color 객체가 map에 μ˜ν•΄ ν•˜λ‚˜ ν•˜λ‚˜ λŒ€μž…λ˜λŠ” 거라면 λΆ„λͺ… color은 μ„œλ‘œ μ°Έμ‘°ν•˜κ³  μžˆμ„κ²Œ λ»”ν•˜λ‹ˆ μ΄λ ‡κ²ŒλŠ” μš°λ¦¬κ°€ μ›ν•˜λŠ” λͺ©ν‘œμ— λ‹¬μ„±ν•˜κΈ° μ–΄λ €μ›Œ 보인닀.

그럼 이제 μ—¬κΈ°μ„œ κΉŠμ€ λ³΅μ‚¬μ˜ κ°œλ…μ΄ λ“±μž₯ν•œλ‹€.

κΉŠμ€ 볡사 (Deep Copy)

μœ„μ—μ„œ μš°λ¦¬κ°€ κΉŠμ€ 볡사λ₯Ό ν•΄μ•Ό ν•œλ‹€κ³  ν•˜λŠ”λ° 그럼 μ–΄λ–»κ²Œ ν• κΉŒ?

μž¬κ·€ ν•˜κΈ°

그럼 μš°λ¦¬κ°€ 얕은 λ³΅μ‚¬μ—μ„œ 봀던 μ½”λ“œμ—μ„œ ν•˜λ‚˜μ”© μ›μ†Œλ₯Ό iteration ν•  λ•Œ, 객체λ₯Ό λ§Œλ‚˜λ©΄ λ³΅μ‚¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž¬κ·€μ μœΌλ‘œ ν˜ΈμΆœν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒ?

 

정닡이닀.

 

κ·Έλ ‡μ§€λ§Œ κ·ΈλŸ¬κΈ°μ—” μ˜ˆμ™Έ 사항도 많고 맀번 μ“Έ λ•Œλ§ˆλ‹€ 뢈러올 수 있게 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜κ±°λ‚˜ 라이브러리처럼 λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”λ°, 우린 κ·Έ μ‹œκ°„μ— λ‹€λ₯Έ κ°œλ…μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λŠ” 게 훨씬 κ²½μ œμ μ΄λ‹€.


그럼 방법이 μžˆμ„κΉŒ?

JSON μ΄μš©ν•˜κΈ°

κ·Έ 방법은 λ°”λ‘œ JSON을 μ΄μš©ν•˜λ©΄ λœλ‹€.

 

μš°λ¦¬κ°€ 객체λ₯Ό JSON으둜 λ§Œλ“€κ³  ν•΄λ‹Ή JSON을 κ°’μœΌλ‘œμ¨ μƒˆλ‘œμš΄ μ›μ†Œμ— λ„£μ–΄μ£Όκ²Œ λœλ‹€λ©΄ 끝이닀.

 

μ‚¬μš© 방법은

볡사 λŒ€μƒ 객체 = JSON.parse(JSON.stringify( 볡사 희망 객체 ));

사싀 이 방법은 μš°λ¦¬κ°€ μ§€κΈˆκ» ν–ˆλ˜ 것듀을 λ¬΄μƒ‰ν•˜κ²Œ ν•  만큼 κ°„λ‹¨ν•˜μ§€λ§Œ κ·Έλž˜λ„ 간단함에 ν•œ μ‹œλ¦„ λ†“κ²Œ λ˜μ—ˆλ‹€.

 

이제 ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ³΄μž.

μ§œμž”.

 

μ„œλ‘œ λ‹€λ₯Έ 객체이며 값을 κ³΅μœ ν•˜μ§€λ„ μ•Šκ²Œ λ˜μ—ˆλ‹€.

 


μ˜€λŠ˜μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ— 얕은 볡사와 κΉŠμ€ 볡사에 λŒ€ν•œ κ°œλ…μ„ μ•Œμ•„λ³΄μ•˜λŠ”λ°, μ§€κΈˆμ΄μ•Ό 단계가 ν•œ λ‹¨κ³„λ‘œ 객체 λ‚΄μ˜ 객체 ν•˜λ‚˜μ§€λ§Œ μš°λ¦¬κ°€ λ¦¬μ•‘νŠΈλ‚˜ λ¦¬λ•μŠ€λ₯Ό ν•˜κ²Œ λœλ‹€λ©΄ λ§Žκ²ŒλŠ” 5κ°œμ—μ„œ 10개의 단계λ₯Ό 거쳐야 ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€.
κ·Έλž˜μ„œ 이 κ°œλ…μ΄ μƒλ‹Ήνžˆ μ€‘μš”ν•œ κ°œλ…μœΌλ‘œ μ†Œκ°œκ°€ 되곀 ν•˜λŠ”λ° ν˜Ήμ‹œλΌλ„ λ¦¬μ•‘νŠΈλ₯Ό λ°°μš°κ±°λ‚˜ λ¦¬λ•μŠ€λ₯Ό 배울 λ•Œ λ‚˜μ˜ 글을 보게 λ˜μ—ˆλ‹€λ©΄ μ‘°κΈˆμ΄λ‚˜λ§ˆ 도움이 λ˜μ—ˆμœΌλ©΄ μ’‹κ² λ‹€.

λŒ“κΈ€