The State of Immutability - Lee-hyuna/33-js-concepts-kr GitHub Wiki

The State of Immutability

ν˜„λŒ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λΆˆλ³€μ„±μ€ 뜨거운 μ£Όμ œμž…λ‹ˆλ‹€. 이 μ£Όμ œκ°€ μ§€κΈˆ 인기λ₯Ό 끌고 μžˆλŠ” μ΄μœ λŠ” κΈ°λŠ₯ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ λ•Œλ¬Έμž…λ‹ˆλ‹€. λΆˆλ³€ λ°μ΄ν„°λŠ” λŒμ—°λ³€μ΄κ°€ μ›μΉ˜ μ•ŠλŠ” λΆ€μž‘μš©μœΌλ‘œ κ°„μ£Όλ˜λŠ” κΈ°λŠ₯적 접근법과 λ°€μ ‘ν•˜κ²Œ μ—°κ²°λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 더 이상 κ³ λ―Όν•˜μ§€ 말고, λŒμ—°λ³€μ΄μ„±κ³Ό λΆˆλ³€μ„±μ— λŒ€ν•œ 세뢀사항을 μ‚΄νŽ΄λ΄…μ‹œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€κ²½ν•  수 μ—†λŠ” 데이터 ꡬ쑰

μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ λ‹€μ–‘ν•œ μ–Έμ–΄μ—μ„œ assign문은 두 가지 λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. κΈ°λ³Έ μœ ν˜•(λ¬Έμžμ—΄, 숫자, λΆ€μšΈ)에 λŒ€ν•œ 할당은 값을 μ „λ‹¬ν•˜λ©°, 볡합 μœ ν˜•(객체)의 경우 μ°Έμ‘°(λ©”λͺ¨λ¦¬ 포인터)λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. 볡합 μœ ν˜•μ˜ 경우, λ³€κ²½ 사항은 μ‹€μ œλ‘œ λ™μΌν•œ μž₯μ†Œμ— λŒ€ν•œ 포인터 일 λΏμ΄λ―€λ‘œ λͺ¨λ“  λ³€κ²½ 사항에 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. 였직 κΈ°λ³Έ μœ ν˜•λ§Œ λΆˆλ³€ν•˜λ©° μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•  수 있으며, κΈ°λ³Έ μœ ν˜•μ„ μ œμ™Έν•œ λͺ¨λ“  μœ ν˜•μ€ 기본적으둜 λ³€κ²½ κ°€λŠ₯ν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ λΆˆλ³€μ˜ μš”μ μ΄ 무엇인지 생각해 λ΄…μ‹œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 이처럼 λΆˆλ³€μ„±μ„ 가진 것이 μ•„λ‹ˆλΌ, λ³΅ν•©μž¬λ£Œλ₯Ό μœ„ν•œ λΆˆλ³€ ꡬ쑰도 μ—†κ³ , 심지어 그것을 언어에 λ„μž…ν•  미래의 κ³„νšλ„ μ—†μŠ΅λ‹ˆλ‹€. μ–Έμ–΄κ°€ μ‹ κ²½ 쓰지 μ•ŠλŠ”λ‹€λ©΄ μ™œ 신경을 써야 ν•©λ‹ˆκΉŒ?

μ‹ λ’°κ°€ μ€‘μš”ν•˜κΈ° λ•Œλ¬Έμ— 신경을 써야 ν•œλ‹€.

λ³€κ²½ κ°€λŠ₯ν•œ ꡬ쑰λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 μ‹ λ’° λΆ€μ‘±μ˜ μ΄μœ μž…λ‹ˆλ‹€. λͺ¨λ“  μ½”λ“œ λΆ€λΆ„μ—μ„œ 참쑰에 λŒ€ν•œ μ•‘μ„ΈμŠ€λ₯Ό 톡해 λ³€ν˜•μ„ μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 맀우 μœ΅ν†΅μ„±μ΄ μžˆμŠ΅λ‹ˆλ‹€. 즉, μ–΄λ–€ 객체도 μ¦‰μ„μ—μ„œ μ™„μ „νžˆ λ‹€λ₯Έ λ¬΄μ–Έκ°€λ‘œ λ³€ν˜• 될 수 μžˆμŠ΅λ‹ˆλ‹€. ν•œ μ€„μ—μ„œλŠ” 개λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 객체가 될 수 있고 λ‹€μŒ μ€„μ—μ„œλŠ” κ°œκ°€ λ‹­μœΌλ‘œ 변이 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 상황은 μƒνƒœ ν˜•νƒœμ™€ μ½”λ“œ 예츑 κ°€λŠ₯성에 λŒ€ν•œ 두렀움을 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.

λŒμ—°λ³€μ΄μ— λŒ€ν•œ λͺ‡ λ§ˆλ””

λŒμ—°λ³€μ΄μ˜ κΈ°νšŒλŠ” 무언가가 λ³€ν•˜μ§€ μ•Šμ„ 것이라고 보μž₯ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€λŠ” 일뢀 ꡬ쑰가 μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ κ°œλ³„ λΆ€λΆ„μ—μ„œ μ‚¬μš©λ  λ•Œ λ°œμƒν•©λ‹ˆλ‹€. 그러면 ν•œ ꡬ성 μš”μ†Œμ˜ λͺ¨λ“  λ³€ν˜•μ΄ λ‹€λ₯Έ ꡬ성 μš”μ†Œμ— 버그λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ²„κ·ΈλŠ” 문제의 원인이 였λ₯˜μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— μΆ”μ ν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 이것은 λ‚˜μœ λΆ€μž‘μš©μ˜ μ˜ˆμž…λ‹ˆλ‹€.

λŒμ—°λ³€μ΄λŠ” λΆ€μž‘μš©μ˜ 원인이닀.

λΆ€μž‘μš©μ€ ν˜„μž¬ λ²”μœ„ 외뢀에 영ν–₯μ„μ£ΌλŠ” λͺ¨λ“  κ²ƒμž…λ‹ˆλ‹€. μ½”λ“œμ˜ λ§Žμ€ 뢀뢄이 λ™μΌν•œ μ°Έμ‘°λ₯Ό λ‹€λ£¨λŠ” 경우, λͺ¨λ“  변경이 λͺ¨λ“  뢀뢄에 영ν–₯μ„μ€λ‹ˆλ‹€. μ½”λ“œκ°€ λ‹¨λ‹¨νžˆ κ²°ν•©λ˜κΈ° μ‹œμž‘ν•˜κ³ , 단일 μ±…μž„ κ·œμΉ™μ„ λ”°λ₯΄λŠ” λŒ€μ‹  μ½”λ“œ 쑰각이 λ°œμƒν•˜κ³ , λ²”μœ„ λ°–μ—μ„œ μ œμ–΄λ˜μ§€ μ•ŠλŠ” μΌμ„ν•˜κ³  있기 λ•Œλ¬Έμ— λΆ€μž‘μš©μ΄ 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€. μ›μΉ˜ μ•ŠλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 더 넓은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ— 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.
λ°–μ—μ„œ λ§Œμ§€λŠ” 것은 항상 μœ„ν—˜ν•˜λ©° μ˜ˆμΈ‘ν•  μˆ˜μ—†λŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€. 버그가 발견되면 질문이 μ œκΈ°λ©λ‹ˆλ‹€ - λ³€κ²½λœ 곳은 μ–΄λ””μž…λ‹ˆκΉŒ? μ •ν™•νžˆ 무엇이 λ°”λ€Œ μ—ˆμŠ΅λ‹ˆκΉŒ? λˆ„κ΅¬λ„ 참쑰에 μ•‘μ„ΈμŠ€ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? κ·ΈλŸ¬λ‚˜ λ³€ν™”μ˜ μ—­μ‚¬λŠ” μ—†μœΌλ©° μ‰½κ²Œ λ‹΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λŒμ—°λ³€μ΄λŠ” ν˜„μž¬ μƒνƒœ 만 μ œκ³΅ν•œλ‹€.

ν•˜λ‚˜μ˜ μ°Έμ‘°κ°€ μ—¬λŸ¬ 번 λ³€κ²½λ˜λ©΄ μ΄λŸ¬ν•œ λ³€κ²½ 사항이 κΈ°λ‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이전 μƒνƒœμ— μ•‘μ„ΈμŠ€ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 객체 속성을 λ³€κ²½ν•˜λ©΄ μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬λ₯Ό λ‹€μ‹œ μ“°κ³ , 이전 값은 μ†μ‹€λ©λ‹ˆλ‹€. 변화에 λŒ€ν•œ 지식 λΆ€μ‘±κ³Ό κ΄€λ ¨λœ λ¬Έμ œλŠ” λ™μΌν•œ λ³€κ²½ κ°€λŠ₯ν•œ ꡬ쑰에 λŒ€ν•œ μ•‘μ„ΈμŠ€ κΆŒν•œμ„ 가진 μ—¬λŸ¬ κ³³μ—μ„œ μ¦κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έ μ‹œκ°„μ— ꡬ쑰가 μ–΄λ–»κ²Œ λ³€ν™”ν•˜λŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

μžλ™μ°¨ κ°μ²΄μ—μ„œ μžμ „κ±° 객체둜 ν˜•νƒœλ₯Ό λ°”κΎΈλŠ” 것 - μ£Όμ°¨μž₯ λͺ¨λ‹ˆν„°λ§ μ—†μŒ!

λŒμ—°λ³€μ΄λŠ” μ˜ˆμΈ‘ν•  수 μ—†λŠ” μƒνƒœμ˜ 원인이닀.

λŒμ—°λ³€μ΄ μ ˆμ°¨μ— λ§Žμ€ 단계가 ν¬ν•¨λ˜μ–΄ μžˆλ‹€λ©΄ λ§Žμ€ 속성이 λ³€κ²½λ˜κ³  μžˆλŠ” 경우 μ ˆμ°¨κ°€ μ€‘κ°„μ—μ„œ μ œμ–΄κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. 이 경우 μƒνƒœλŠ” 이전 μœ νš¨ν•œ λ²„μ „μœΌλ‘œ λ‘€λ°±ν•΄μ•Όν•˜λ©°, 그렇지 μ•Šμ€ 경우 μƒνƒœλŠ” μ•Œ 수 μ—†λŠ” λͺ¨μ–‘μœΌλ‘œ λ‚¨μŠ΅λ‹ˆλ‹€. μ•Œ 수 μ—†κ³  μ˜ˆμΈ‘ν•  μˆ˜μ—†λŠ” μƒνƒœλŠ” 이 ꡬ쑰가 μ†ŒλΉ„λ˜λŠ” μž₯μ†Œμ—μ„œ 좩돌둜 λ³€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

반면 λŒμ—°λ³€μ΄λŠ” 기얡을 μž¬μ‚¬μš©ν•˜κ³  λΉ λ¦…λ‹ˆλ‹€.

κ·Έλ ‡μŠ΅λ‹ˆλ‹€. λŒμ—°λ³€μ΄κ°€ 기얡을 μž¬μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λŒμ—°λ³€μ΄λŠ” μ„±λŠ₯κ³Ό λ©”λͺ¨λ¦¬ μ‚¬μš©μ— μœ λ¦¬ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” 21세기에 μ‚΄κ³  있으며 λ©”λͺ¨λ¦¬κ°€ μ €λ ΄ν•˜κ³  ν”„λ‘ νŠΈμ—”λ“œ 개발의 μ†Œκ·œλͺ¨ 규λͺ¨μ—μ„œλŠ” μ–΄λ–€ 객체가 볡사 될지 μ—¬λΆ€λŠ” μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λΆˆλ³€ 볡사본이 μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ  μœ„ν—˜μ€ μ—†μŠ΅λ‹ˆλ‹€. 가비지(Garbage) μ»¬λ ‰ν„°λŠ” μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ‚˜ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ μœ μ— λŒ€ν•΄ κ±±μ •ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

... λͺ…ν™•ν•˜κ²Œ λ§ν•˜λ©΄ ν”„λ‘ νŠΈ μ—”λ“œ 츑면의 문제λ₯Ό μ–ΈκΈ‰ν•˜κ³  μžˆμ§€λ§Œ, λ©”λͺ¨λ¦¬κ°€ κ°€μž₯ μ€‘μš”ν•œ λ‹€λ₯Έ λ§Žμ€ μ’…λ₯˜μ˜ μ†Œν”„νŠΈμ›¨μ–΄κ°€ μžˆλ‹€λŠ” 것은 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” λ§Žμ€ 기얡을 κ°€μ§€κ³ μžˆλ‹€.

Place Oriented Programming β€” PLOP

Rich Hickeyκ°€ μ œμ‹œ ν•œ μš©μ–΄λŠ” μ •ν™•ν•˜κ²Œ 가변성을 μ‚¬μš©ν•˜λŠ” 감각을 ν¬μ°©ν•©λ‹ˆλ‹€. 값에 λŒ€ν•œ 보증이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, 우리의 κ°μ²΄λŠ” 단지 λ©”λͺ¨λ¦¬μ—μžˆλŠ” μž₯μ†Œμ— λŒ€ν•œ 포인터 μΌλΏμž…λ‹ˆλ‹€. κ°μ²΄λŠ” λͺ¨μ–‘ Aμ—μ„œ μž‘μ„±λ˜μ—ˆμ§€λ§Œ μ½”λ“œ μ‹€ν–‰ 쀑에 λͺ¨μ–‘ B, C, D λ“±μœΌλ‘œ λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ³€μˆ˜λŠ” 값이 μ•„λ‹Œ λ©”λͺ¨λ¦¬λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

λΆˆλ³€μ΄λž€ 값에 κ΄€ν•œ κ²ƒμž…λ‹ˆλ‹€.

μ˜μƒ... https://youtu.be/-6BsiVyC1kM

λΆˆλ³€μ΄λž€ 말 κ·ΈλŒ€λ‘œ λŒμ—°λ³€μ΄κ°€ 될 μˆ˜μ—†λŠ” 것이고, λ‚˜λŠ” 더 멀리 λ‚˜μ•„κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λŒμ—°λ³€μ΄λŠ” 단지 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ³€μˆ˜λŠ” 단일 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. valueA! == valueBμ΄λ―€λ‘œ κ°’μ˜ λ³€ν™˜μ΄ μ—†μŠ΅λ‹ˆλ‹€. 값은 사싀이며 사싀은 λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. νŠΉμ • κ°’μœΌλ‘œ μ„ μ–Έ 된 것이 있으면 λ‚˜λ¨Έμ§€ μ½”λ“œλŠ”μ΄ μ •ν™•ν•œ 값이 μžˆλ‹€λŠ” 것을 μ™„μ „νžˆ μ‹ λ’°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 보증은 λΆ€μž‘μš©μ΄μ—†κ³  μ˜ˆμΈ‘ν•  μˆ˜μ—†λŠ” μƒνƒœκ°€ κ΄€μ°°λ˜μ§€ μ•Šκ³ , κ°€μž₯ μ€‘μš”ν•œ 것은 μ‹ λ’°λ₯Ό μž¬κ΅¬μ„±ν•˜λŠ” 것이며, μ½”λ“œμ˜ 일뢀뢄이 μ•½κ°„ λ‹€λ₯Έ ꡬ쑰λ₯Ό ν•„μš”λ‘œν•œλ‹€κ³  ν•˜λ”λΌλ„ μ›λž˜μ˜ ꡬ쑰에 μ†λŒ€μ§€ μ•Šκ³  자체 λ²„μ „μœΌλ‘œ μž‘λ™ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 값을 μ‚¬μš©ν•˜λ©΄ 보증 및 ν™•κ³ ν•œ 계약이 μ œκ³΅λ©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ 포인터λ₯Ό μ‚¬μš©ν•˜λ©΄ 보증 및 계약이 μ œκ³΅λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ³€κ²½ν•  μˆ˜μ—†λŠ” ꡬ쑰와 λ³€κ²½ κ°€λŠ₯ν•œ ꡬ쑰

Value Oriented Programming β€” VOP

PLOPμ™€λŠ” 달리 VOPλŠ” 값에 κ΄€ν•œ κ²ƒμž…λ‹ˆλ‹€. μ½”λ“œλŠ” λ©”λͺ¨λ¦¬μ˜ 포인터가 μ•„λ‹Œ κ°’μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 값을 λ‚˜νƒ€λ‚΄λŠ” 것은 λΆ„λ¦¬λœ ꡬ쑰 μ—¬μ•Όν•©λ‹ˆλ‹€. 값은 μƒμ„±μ—μ„œ νŒŒκΈ°κΉŒμ§€ λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ¨λ“  μˆœμˆ˜ν•œ κΈ°λŠ₯ μ–Έμ–΄λŠ” 값이 지ν–₯μ μž…λ‹ˆλ‹€.

μ–΄λ–€ 차이도 μƒˆ 값에 λ°˜μ˜λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

λ³€ν™”λŠ” λŒμ—°λ³€μ΄λ₯Ό μ˜λ―Έν•˜μ§€λŠ” μ•ŠμœΌλ©°, λ³€ν™”μ˜ μ˜λ―ΈλŠ” λ³€ν™”λ₯Ό λ°˜μ˜ν•œ μƒˆλ‘œμš΄ λ²„μ „μ˜ μƒνƒœλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ¨λ“  κ²½μš°μ— 적용 κ°€λŠ₯ν•©λ‹ˆκΉŒ? 이것은 일뢀 개발자, λ‚˜λ„, λΆˆλ³€μ˜ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” λŒ€κ·œλͺ¨ 데이터 μˆ˜μ§‘κ³Ό 같이 큰 것이 μ‘΄μž¬ν•  λ•Œ μ‹œμž‘λ˜λ©° μž‘μ€ λ³€ν™” 만이 μˆ˜ν–‰λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. 그런 κ²½μš°μ— μƒˆλ‘œμš΄ ꡬ쑰λ₯Ό λ§Œλ“œλŠ” 것이 잘λͺ»λ˜μ—ˆλ‹€κ³  느껴질 λ•Œ, κ·Έ 기얡이 맀우 λΉ„νš¨κ³Όμ μΈ λ°©μ‹μœΌλ‘œ μ‚¬μš©λ˜λŠ” κ²ƒμœΌλ‘œ λŠκ»΄μ§‘λ‹ˆλ‹€. μ™œ μ •λ§λ‘œ λ°μ΄ν„°μ˜ μƒˆλ‘œμš΄ ꡬ쑰λ₯Ό λ§Œλ“€ ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.
μ‹€μ œλ‘œ ν•˜λ‚˜μ˜ μš”μ†Œλ§Œ μΆ”κ°€ν•΄μ•Όν•˜κ±°λ‚˜ ν•˜λ‚˜μ˜ ν•„λ“œλ₯Ό λ³€κ²½ν•΄μ•Όν•œλ‹€λ©΄?

그리고이 μ§ˆλ¬Έμ— λŒ€ν•œ 닡은 λ³€ν™”λœ ꡬ쑰가 λ‹€λ₯Έ 값을 λ‚˜νƒ€λ‚΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이전과 λ³€κ²½λœ 두 μ»¬λ ‰μ…˜μ€ λ™μΌν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ°’μ˜ 크기에도 λΆˆκ΅¬ν•˜κ³  사싀은 λ³€κ²½ 될 수 μ—†μœΌλ©° 값은 λ³€ν•  수 μ—†λŠ” μ‚¬μ‹€μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 당신이 κ°’μ˜ κ΄€μ μ—μ„œ μƒκ°ν•˜κΈ° μ‹œμž‘ν•œλ‹€λ©΄, 그런 μ˜μ‹¬μ€ 당신을 κ΄΄λ‘­νžˆμ§€ 말아야 ν•©λ‹ˆλ‹€. μ˜μ‹¬μ΄ 사라지지 μ•ŠμœΌλ©΄ Immutable.jsκ°€ λ‹€μŒ μž₯μ—μ„œ 그에 λŒ€ν•œ λͺ‡ λ§ˆλ””λ₯Ό κ΅¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

Value Oriented Programming in JavaScript

VOPλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ κ΅¬ν˜„ 될 수 μžˆμŠ΅λ‹ˆλ‹€. 전에 λ§ν–ˆλ“―μ΄ μžλ°” μŠ€ν¬λ¦½νŠΈμ—λŠ” λΆˆλ³€ ꡬ쑰가 μ—†μ§€λ§Œ 원칙과 κ·œμΉ™μ— 따라 λΆˆλ³€μ„±μ„ 달성 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

객체 κ³ μ •(Freeze your objects)

Object.freeze λ©”μ„œλ“œλŠ” μΆ”κ°€ λ³€ν˜•μœΌλ‘œλΆ€ν„° 객체λ₯Ό 차단할 μˆ˜μžˆλŠ” 기회λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

const frog = { color: 'green', sound: 'ribbit ribbit' };
Object.freeze(frog);
frog.color = 'red';
frog.sound = 'hau hau';
console.log(frog); // {color: "green", sound: "ribbit ribbit"}

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” frog 속성을 λ³€κ²½ν•˜λ €ν–ˆμ§€λ§Œ κ²°κ³ΌλŠ” 객체가 λ³€κ²½λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. Object.freezeκ°€ 객체 ν•„λ“œμ—μ„œλ§Œ λŒμ—°λ³€μ΄λ₯Ό μ°¨λ‹¨ν•œλ‹€λŠ” 사싀은 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. 즉 얕은 freezeμž…λ‹ˆλ‹€. 얕은 것은 객체 λ‚΄λΆ€μ˜ λ³΅μž‘ν•œ ꡬ쑰가 μ—¬μ „νžˆ 변이 될 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

λ³€κ²½ μž‘μ—… λŒ€μ‹  μƒˆ μΈμŠ€ν„΄μŠ€ λ§Œλ“€κΈ°

// object
const claraFrog = { color: 'green', name: 'Clara' };
const juliaFrog = { ...claraFrog, name: 'Julia' };
// array
const week = ['monday','tuesday','wednesday','thursday','friday','saturday', 'sunday'];
const betterWeek = [...week];
betterWeek.shift(); // week without monday :)

μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžλŠ” λ°°μ—΄ 및 κ°μ²΄μ—μ„œ μƒˆ 값을 λ§Œλ“œλŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그것은 맀우 νŽΈλ¦¬ν•œ 도ꡬ이며, μ½”λ“œλ„ 맀우 λͺ…ν™•ν•˜κ²Œ λ³΄μž…λ‹ˆλ‹€. λ³€κ²½λœ λ‚΄μš©κ³Ό μž¬μ‚¬μš© 된 λ‚΄μš©μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžκ°€ 얕은 볡사λ₯Ό μˆ˜ν–‰ν•˜λ©΄ 루트 객체 μ°Έμ‘°κ°€ λ³€κ²½λ˜μ§€λ§Œ λͺ¨λ“  ν•„λ“œ(객체) λ˜λŠ” ν–‰(λ°°μ—΄)이 λ‹€μ‹œ μ‚¬μš©λœλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. λ˜ν•œμ΄ 방법이 효율적인 λ°©μ‹μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 데이터 ꡬ쑰 μ‚¬μš©

λ°” μŠ€ν¬λ¦½νŠΈλŠ” μƒμžμ—μ„œ λ²—μ–΄λ‚œ λΆˆλ³€ ꡬ쑰λ₯Ό 가지고 μžˆμ§€ μ•Šμ§€λ§Œ 제 3자 κ΅¬ν˜„μ΄ μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ μΈκΈ°μžˆλŠ” 것은 Immutable.js와 moriμž…λ‹ˆλ‹€. λ‘˜ λ‹€ 검색 트리 ꡬ쑰의 일쒅 인 trie데이터 ꡬ쑰λ₯Ό κΈ°λ°˜μœΌλ‘œν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ΅¬μ‘°λŠ” 볡사없이 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 맀우 효율적인 방법을 ν—ˆμš©ν•©λ‹ˆλ‹€.

trieλ₯Ό μ‚¬μš©ν•˜λŠ” 개인적인 κ΄€μ μ—μ„œ λ³Ό λ•Œ, μ‹€μ œλ‘œ λ³΅μž‘ν•œ κ΅¬μ‘°μ—μ„œλŠ” 데이터 ꡬ쑰가 유용 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 무엇보닀도 λ‚˜λŠ” μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžλ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€. 그리고 μ„±λŠ₯ λ¬Έμ œκ°€ λ‚˜νƒ€λ‚  λ•ŒκΉŒμ§€ 제3자 μ†”λ£¨μ…˜μ„ κ³ λ €ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

λΆˆλ³€ κΈ°λŠ₯이 ν•¨μˆ˜ ν”„λ‘œκ·Έλž˜λ°μ— λ¬Άμ—¬ μžˆμŠ΅λ‹ˆκΉŒ?

μ „ν˜€ μ•„λ‹ˆλ‹€. VOPλŠ” λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ—μ„œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. μš”μ¦˜μ—λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 전문가와 μ „λ„μžκ°€ λΆˆλ³€μ˜ μƒνƒœ μ €μž₯ 객체에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ° VOPλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ™€ 같은 이점을 μ œκ³΅ν•©λ‹ˆλ‹€. μƒνƒœκ°€μ—†λŠ” 객체 λ˜λŠ” λΆˆλ³€ μƒνƒœλ₯Ό 가진 κ°μ²΄λŠ” 그것을 μ†ŒλΉ„ν•˜λŠ” λͺ¨λ“  λ‹Ήμ‚¬μžμ— λŒ€ν•΄ 보증과 μ‹ λ’°λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λΆˆλ³€ κ°μ²΄λŠ” λͺ¨λ“  쒅속성을 μƒμ„±μžμ— μ „λ‹¬ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— 단일 μ±…μž„ κ·œμΉ™μ„ μ¦ν­ν•©λ‹ˆλ‹€. ImmunabilityλŠ” 객체 라이브 사이클 쀑 μƒνƒœ 변경을 μ°¨λ‹¨ν•©λ‹ˆλ‹€. 즉, 객체가 μ²˜μŒλΆ€ν„° λκΉŒμ§€ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μƒνƒœλ‘œ μœ μ§€λœλ‹€λŠ” 것을 ν™•μ‹  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

setterλ₯Ό μžŠμ–΄ 버리고 OOP에 λΆˆλ³€ 객체λ₯Ό λ§Œλ“­λ‹ˆλ‹€. 이 μ£Όμ œμ— λŒ€ν•œ ν›Œλ₯­ν•œ 이야기 μ•„λž˜μ„œ, Yegor Bugayenkoκ°€ μžλ°” 언어와 관련이 μžˆμŠ΅λ‹ˆλ‹€.

μ˜μƒ https://youtu.be/p7m7_iiqaHI

당신은 λΆˆλ³€μ˜ μ€€λΉ„κ°€ λ˜μ…¨μŠ΅λ‹ˆκΉŒ?

κ³ λ €ν•΄μ•Ό ν•  λͺ¨λ“  것듀 - λΆˆλ³€μ„±μ€ κ·œμΉ™κ³Ό 원칙에 μ˜ν•΄ 달성 될 수 μžˆμŠ΅λ‹ˆλ‹€. μžλ°” μŠ€ν¬λ¦½νŠΈλŠ” λ³€κ²½λ˜μ§€ μ•Šμ€ λΆˆλ³€μ„±μ„ 가지고 μžˆμ§€ μ•ŠμœΌλ―€λ‘œ, 퍼블릭 μ—°μ‚°μžμ™€ μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΆˆλ³€μ„±μ΄ κ·œμΉ™μ— κ΄€ν•œ 것이라면 λͺ¨λ“  것이 개발자의 손에 달렀 μžˆμŠ΅λ‹ˆλ‹€. κ°’μ˜ 값을 본닀면이 이 μˆœκ°„λΆ€ν„°λŠ” κ·Έ λŒμ—°λ³€μ΄κ°€ λ‹Ήμ‹ μ˜ μ‘μš©μ— μ—†μ–΄μ Έμ•Ό ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ¬Έμ œλŠ” λ‚˜μœ μŠ΅κ΄€μ•  있으며, λ‚˜μœ μŠ΅κ΄€μ€ λŒ€λΆ€λΆ„ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λΉ„λ‘―λ©λ‹ˆλ‹€. λ‚˜μœ μŠ΅κ΄€μ€ 우리의 마음 속에 있으며, 우리의 ν”ΌλΆ€ μ•„λž˜ μžˆμŠ΅λ‹ˆλ‹€. 객체의 setter와 같은 λ‚˜μœ κ΄€ν–‰, 객체 μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λ©”μ†Œλ“œ, μƒνƒœ 인 객체, κ±°λŒ€ν•œ λ‹€ν˜•μ„± 객체 등은 잘λͺ»λœ κ²ƒμœΌλ‘œ κ°„μ£Όλ˜μ–΄ λ‹€μ‹œλŠ” μ‚¬μš©λ˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€.

μƒκ°μ˜ 방식을 λ°”κΎΈκ³  κ°’μ˜ 값을 λ³΄μ‹­μ‹œμ˜€. λΆˆλ³€μ„±μ„ μ„ νƒν•˜λŠ” 것은 예츑 κ°€λŠ₯ν•˜κ³  효율적이며 버그가 적은 ν”„λ‘œκ·Έλž¨μ„ ν–₯ν•œ 큰 λ°œκ±ΈμŒμž…λ‹ˆλ‹€.