--- id: P-REINFORCE-AUTO-647D86 category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - λΆˆλ³€μ„±(Immutability)" --- # [[λΆˆλ³€μ„±(Immutability)]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > λΆˆλ³€μ„±(Immutability)은 μ΄ˆκΈ°ν™” 이후 객체의 μ†μ„±μ΄λ‚˜ λ°°μ—΄ μš”μ†Œμ™€ 같은 데이터가 예기치 μ•Šκ²Œ μˆ˜μ •λ˜λŠ” 것을 λ°©μ§€ν•˜λŠ” κ°œλ…μ΄λ‹€ [1, 2]. TypeScriptμ—μ„œλŠ” 주둜 `readonly` μˆ˜μ‹μ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œ 없이 컴파일 νƒ€μž„μ— μ„ μ–Έμ μœΌλ‘œ λΆˆλ³€μ„±μ„ κ°•μ œν•œλ‹€ [2-4]. μ΄λŠ” μ˜λ„μΉ˜ μ•Šμ€ μƒνƒœ λ³€κ²½μ΄λ‚˜ 데이터 μ˜€μ—Όμ„ 사전에 λ°©μ§€ν•˜μ—¬ μ½”λ“œμ˜ 예츑 κ°€λŠ₯성을 높이고 버그λ₯Ό μ€„μ΄λŠ” 데 ν•„μˆ˜μ μΈ 역할을 ν•œλ‹€ [4, 5]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **λΆˆλ³€μ„±μ˜ 원리와 μž₯점** λŸ°νƒ€μž„μ— λ™μž‘ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ `Object.freeze()`와 달리, TypeScript의 `readonly`λ₯Ό ν™œμš©ν•œ λΆˆλ³€μ„± κ΅¬ν˜„μ€ λŸ°νƒ€μž„ μ„±λŠ₯ λΉ„μš© 없이 컴파일 μ‹œμ μ˜ ꡬ쑰적 νƒ€μž… 체크λ₯Ό 톡해 였λ₯˜λ₯Ό μ°Ύμ•„λ‚Έλ‹€ [4, 6]. μ΄λŠ” 방어적 코딩을 쀄여주며, 예츑 κ°€λŠ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœ 관리와 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄μ„ 효과적으둜 μ§€μ›ν•œλ‹€ [1, 4, 7]. λ˜ν•œ, `const`κ°€ λ³€μˆ˜μ˜ μž¬ν• λ‹Ήλ§Œμ„ λ§‰λŠ” 것에 λ°˜ν•΄ `readonly`λŠ” 참쑰된 객체 λ‚΄λΆ€μ˜ μ½˜ν…μΈ  자체λ₯Ό λ™κ²°μ‹œν‚¨λ‹€λŠ” μ μ—μ„œ λͺ…ν™•νžˆ κ΅¬λ³„λœλ‹€ [6, 8]. * **TypeScriptμ—μ„œμ˜ κ΅¬ν˜„ 방법** * **객체 및 λ°°μ—΄ 보호:** ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€ λ‚΄ 속성에 `readonly` ν‚€μ›Œλ“œλ₯Ό μ„ μ–Έν•˜κ±°λ‚˜, 배열에 `readonly T[]` λ˜λŠ” `ReadonlyArray`λ₯Ό μ§€μ •ν•˜λ©΄ 값을 λ³€κ²½ν•˜λŠ” λ©”μ„œλ“œ(`push`, `pop` λ“±)의 μ‚¬μš©μ΄ νƒ€μž… μ‹œμŠ€ν…œμ—μ„œ μ™„μ „νžˆ μ œκ±°λœλ‹€ [9, 10]. * **얕은(Shallow) λΆˆλ³€μ„±κ³Ό κΉŠμ€(Deep) λΆˆλ³€μ„±:** λ‚΄μž₯된 `Readonly` μœ ν‹Έλ¦¬ν‹°λ‚˜ κΈ°λ³Έ `readonly` ν‚€μ›Œλ“œλŠ” 객체의 μ΅œμƒμœ„ μ†μ„±λ§Œ λ³΄ν˜Έν•˜λŠ” 얕은 μˆ˜μ€€μ˜ λΆˆλ³€μ„±μ„ μ œκ³΅ν•˜λ―€λ‘œ, μ€‘μ²©λœ ν•˜μœ„ 객체의 변경은 막지 λͺ»ν•œλ‹€ [1, 11, 12]. 쀑첩 데이터 트리의 μ™„λ²½ν•œ 무결성을 보μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ§€ν•‘ νƒ€μž…(Mapped Types)κ³Ό 쑰건뢀 νƒ€μž…(Conditional Types)을 κ²°ν•©ν•˜μ—¬ μž¬κ·€μ μœΌλ‘œ λ™μž‘ν•˜λŠ” `DeepReadonly` μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ„ ꡬ좕해야 ν•œλ‹€ [11, 12]. * **`as const` 단언:** κ°μ²΄λ‚˜ λ°°μ—΄ μ„ μ–Έ μ‹œ `as const`λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ λ³€μˆ˜λ₯Ό λ¦¬ν„°λŸ΄ νƒ€μž…μœΌλ‘œ μ’νžˆλŠ” λ™μ‹œμ— κΉŠμ€(deep) 읽기 μ „μš© μƒνƒœλ₯Ό λΆ€μ—¬ν•  수 μžˆλ‹€ [13, 14]. * **주의점 및 ν•œκ³„μ  (Aliasing μ·¨μ•½μ„±)** `readonly`λŠ” μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή μ°Έμ‘°λ₯Ό ν†΅ν•œ 직접적인 μˆ˜μ •μ„ 막아쀄 뿐, 변이가 ν—ˆμš©λœ λ‹€λ₯Έ λ³€μˆ˜λ‚˜ λ§€κ°œλ³€μˆ˜(별칭, Alias)둜 값이 전달될 κ²½μš°μ—λŠ” `readonly` 보μž₯이 μƒμ‹€λ˜μ–΄ 원본 데이터가 변경될 수 μžˆλŠ” 취약점이 μžˆλ‹€ [15, 16]. λ”°λΌμ„œ μ—„κ²©ν•œ λΆˆλ³€μ„±μ„ μœ μ§€ν•˜λ €λ©΄ ν•¨μˆ˜ μ„œλͺ… λ‹¨κ³„μ—μ„œλΆ€ν„° μΌκ΄€λ˜κ²Œ `readonly` λ§€κ°œλ³€μˆ˜λ₯Ό κ°•μ œν•˜λ„λ‘ 섀계해야 ν•œλ‹€ [16, 17]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[readonly]], [[DeepReadonly]], [[as const]], [[ꡬ쑰적 타이핑(Structural Typing)]] - **Projects/Contexts:** [[μƒνƒœ 관리(State Management)]], [[TypeScript νƒ€μž… μ‹œμŠ€ν…œ 및 μΈν„°νŽ˜μ΄μŠ€ 섀계]] - **Contradictions/Notes:** μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ `Object.freeze()`λŠ” λŸ°νƒ€μž„μ— 직접 객체λ₯Ό λ™κ²°ν•˜μ—¬ λ³΄ν˜Έν•˜μ§€λ§Œ μ„±λŠ₯ μ €ν•˜κ°€ λ™λ°˜λ˜λŠ” 반면, TypeScript의 `readonly`λŠ” λŸ°νƒ€μž„ μ„±λŠ₯ μ €ν•˜λŠ” μ—†μœΌλ‚˜ νƒ€μž… ν˜Έν™˜μ„±μ„ μ•…μš©ν•œ 우회(Aliasing) λ³€ν˜•κΉŒμ§€λŠ” μ™„λ²½νžˆ μ°¨λ‹¨ν•˜μ§€ λͺ»ν•œλ‹€λŠ” ν•œκ³„λ₯Ό μ§€λ‹Œλ‹€ [4, 6, 15, 18]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/λΆˆλ³€μ„±(Immutability).md]] ---