--- id: P-REINFORCE-AUTO-EDA6A3 category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Readonly Type" --- # [[Readonly Type]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > TypeScript의 `Readonly Type` (λ˜λŠ” `readonly` μˆ˜μ‹μ–΄)은 객체의 속성, λ°°μ—΄ 등이 μ΄ˆκΈ°ν™”λœ 이후 μˆ˜μ •λ˜λŠ” 것을 λ°©μ§€ν•˜μ—¬ νƒ€μž… μˆ˜μ€€μ—μ„œ λΆˆλ³€μ„±(Immutability)을 κ°•μ œν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€[1, 2]. μ΄λŠ” λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œ 없이 컴파일 νƒ€μž„μ— 예기치 μ•Šμ€ λ°μ΄ν„°μ˜ 변이λ₯Ό μ°¨λ‹¨ν•˜λ©°, λ³€μˆ˜μ˜ μž¬ν• λ‹Ήμ„ λ§‰λŠ” `const`λ‚˜ λŸ°νƒ€μž„ λ™μž‘μΈ `Object.freeze()`와 κ΅¬λ³„λ©λ‹ˆλ‹€[3-5]. 주둜 μ„€μ • 객체, API 응닡, μƒνƒœ 관리 λ“± λ³€κ²½λ˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” 데이터 ꡬ쑰λ₯Ό λ³΄ν˜Έν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€[6, 7]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **μž‘λ™ 방식 및 컴파일 νƒ€μž„ 보호:** `readonly`λŠ” 객체의 μ†μ„±μ΄λ‚˜ 클래슀, μΈν„°νŽ˜μ΄μŠ€μ— μ μš©λ˜μ–΄ ν• λ‹Ή ν›„ λ³€κ²½(mutate) μ‹œλ„λ₯Ό ν•  λ•Œ 컴파일러 μˆ˜μ€€μ—μ„œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€[3, 8]. 이 κΈ°λŠ₯은 였직 컴파일 μ‹œμ μ—λ§Œ μ‘΄μž¬ν•˜λ©°, μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ λ³€ν™˜λœ μ΄ν›„μ—λŠ” μ œκ±°λ˜λ―€λ‘œ μ„±λŠ₯ μ €ν•˜λ‚˜ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€[3, 5, 9]. * **`Readonly` μœ ν‹Έλ¦¬ν‹° νƒ€μž…:** TypeScriptλŠ” κΈ°μ‘΄ 객체 νƒ€μž…μ˜ λͺ¨λ“  속성을 읽기 μ „μš©μœΌλ‘œ λ³€ν™˜ν•΄ μ£ΌλŠ” `Readonly` λ‚΄μž₯ μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ„ μ œκ³΅ν•©λ‹ˆλ‹€[2, 10]. λ§Œμ•½ `readonly` 속성을 λ‹€μ‹œ κ°€λ³€(mutable) μƒνƒœλ‘œ 되돌리고 μ‹Άλ‹€λ©΄, λ§€ν•‘λœ νƒ€μž…(Mapped Type) κ΅¬λ¬Έμ—μ„œ `-readonly` μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 속성을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€[11]. * **λ°°μ—΄κ³Ό νŠœν”Œμ˜ λΆˆλ³€μ„±:** λ°°μ—΄μ΄λ‚˜ νŠœν”Œμ— `readonly` μ œμ–΄μžλ₯Ό λΆ™μ΄κ±°λ‚˜ `ReadonlyArray`λ₯Ό μ‚¬μš©ν•˜λ©΄, 배열을 λ³€μ΄μ‹œν‚€λŠ” `push`, `pop`κ³Ό 같은 λ©”μ„œλ“œκ°€ νƒ€μž… μ‹œκ·Έλ‹ˆμ²˜μ—μ„œ μ œκ±°λ˜μ–΄ μ›μ²œμ μœΌλ‘œ μ‚¬μš©μ΄ μ°¨λ‹¨λ©λ‹ˆλ‹€[12, 13]. 단, `map`μ΄λ‚˜ `filter` 같이 원본을 μˆ˜μ •ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλŠ” κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€[12]. * **얕은 λΆˆλ³€μ„±(Shallow Immutability)의 ν•œκ³„:** 기본적인 `readonly` μ œμ–΄μžμ™€ `Readonly` νƒ€μž…μ€ μ΅œμƒμœ„ μ†μ„±μ—λ§Œ μ μš©λ˜λŠ” 얕은(shallow) μˆ˜μ€€μ˜ 보호만 μ œκ³΅ν•˜μ—¬ μ€‘μ²©λœ 객체 λ‚΄λΆ€λŠ” μ—¬μ „νžˆ 변경될 수 μžˆμŠ΅λ‹ˆλ‹€[4, 5, 14]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ§€ν•‘ νƒ€μž…κ³Ό 쑰건뢀 νƒ€μž…μ„ κ²°ν•©ν•˜μ—¬ μž¬κ·€μ μœΌλ‘œ 속성을 λ™κ²°ν•˜λŠ” `DeepReadonly` μ»€μŠ€ν…€ νƒ€μž…μ„ 직접 μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€[4, 14, 15]. * **별칭(Aliasing)으둜 μΈν•œ 취약점:** `readonly` νƒ€μž…μ˜ 데이터λ₯Ό κ°€λ³€(mutable) λ§€κ°œλ³€μˆ˜λ₯Ό κΈ°λŒ€ν•˜λŠ” ν•¨μˆ˜μ— 전달할 경우, TypeScriptλŠ” νƒ€μž… ν˜Έν™˜μ„± κ·œμΉ™μ— μ˜ν•΄ 이λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€[16]. 이둜 인해 `readonly`둜 μ„ μ–Έλœ 데이터라 ν•˜λ”λΌλ„ 우회적인 경둜(Alias)λ₯Ό 톡해 값이 μˆ˜μ •λ  수 μžˆλŠ” ν•œκ³„(Gotcha)κ°€ μ‘΄μž¬ν•˜λ―€λ‘œ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜ 섀계 μ‹œ μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€[16-18]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Immutability]], [[Utility Types]], [[DeepReadonly]], [[Object.freeze()]], [[Mapped Types]] - **Projects/Contexts:** [[Functional Programming]], [[State Management]] - **Contradictions/Notes:** μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ `const`λŠ” λ³€μˆ˜ 자체의 μž¬ν• λ‹Ήμ„ 막고 객체 λ‚΄λΆ€ μ†μ„±μ˜ 변경은 ν—ˆμš©ν•˜μ§€λ§Œ, TypeScript의 `readonly`λŠ” 객체 λ‚΄λΆ€ μ†μ„±μ˜ 변경을 λ§‰μŠ΅λ‹ˆλ‹€[4, 19]. λ˜ν•œ `Object.freeze()`λŠ” λŸ°νƒ€μž„μ— 얕은 동결을 μˆ˜ν–‰ν•˜μ§€λ§Œ, `readonly`λŠ” λŸ°νƒ€μž„ μ„±λŠ₯ λΉ„μš© 없이 컴파일 νƒ€μž„μ—λ§Œ μ—„κ²©ν•˜κ²Œ κ²€μ‚¬ν•œλ‹€λŠ” 차이가 μžˆμŠ΅λ‹ˆλ‹€[5, 20, 21]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/Readonly Type.md]] ---