--- id: P-REINFORCE-AUTO-33C0BF 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 μœ ν‹Έλ¦¬ν‹° νƒ€μž…" --- # [[Readonly μœ ν‹Έλ¦¬ν‹° νƒ€μž…]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > Readonly μœ ν‹Έλ¦¬ν‹° νƒ€μž…(`Readonly`)은 TypeScriptμ—μ„œ νŠΉμ • 객체 νƒ€μž…μ˜ λͺ¨λ“  속성에 `readonly` μˆ˜μ‹μ–΄λ₯Ό μΆ”κ°€ν•˜μ—¬ μ΄ˆκΈ°ν™” 이후 값을 μž¬ν• λ‹Ήν•  수 없도둝 λ³€ν™˜ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€[1, 2]. μ΄λŠ” λŸ°νƒ€μž„ μ„±λŠ₯ μ €ν•˜ 없이 컴파일 νƒ€μž„μ—λ§Œ μ—„κ²©ν•˜κ²Œ λΆˆλ³€μ„±μ„ κ°•μ œν•˜μ—¬, μ˜λ„μΉ˜ μ•Šμ€ 데이터 λ³€ν˜•μœΌλ‘œ μΈν•œ 버그λ₯Ό 사전에 μ°¨λ‹¨ν•©λ‹ˆλ‹€[3, 4]. 단, μ΅œμƒμœ„ μ†μ„±μ—λ§Œ μ μš©λ˜λŠ” 얕은(shallow) λΆˆλ³€μ„±λ§Œμ„ μ œκ³΅ν•˜λ―€λ‘œ, μ€‘μ²©λœ 객체λ₯Ό μ™„μ „νžˆ λ™κ²°ν•˜λ €λ©΄ μž¬κ·€μ μΈ ν˜•νƒœμ˜ λ”₯ λ¦¬λ“œμ˜¨λ¦¬(Deep Readonly) νŒ¨ν„΄μ΄ λ³„λ„λ‘œ ν•„μš”ν•©λ‹ˆλ‹€[5, 6]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) - **κΈ°λ³Έ μž‘λ™ 원리와 문법:** `Readonly`λŠ” μ£Όμ–΄μ§„ νƒ€μž… `T`의 λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό 읽기 μ „μš©μœΌλ‘œ λ§€ν•‘ν•©λ‹ˆλ‹€[1, 2]. μ„€μ •μ΄λ‚˜ API 응닡, μƒνƒœ 관리 λ¦¬λ“€μ„œ λ“± μ•± λ‚΄λ‚΄ 값이 μœ μ§€λ˜μ–΄μ•Ό ν•˜λŠ” 객체λ₯Ό λ³΄ν˜Έν•  λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€[7, 8]. TypeScript μ½”λ“œκ°€ 컴파일된 ν›„μ—λŠ” κ΄€λ ¨ μ–΄λ…Έν…Œμ΄μ…˜μ΄ λͺ¨λ‘ μ‚¬λΌμ§€λ―€λ‘œ μ‹€ν–‰ μ‹œμ (Runtime)μ—λŠ” μ–΄λ– ν•œ μ˜€λ²„ν—€λ“œλ„ λ°œμƒμ‹œν‚€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€[3, 9]. - **μœ μ‚¬ κ°œλ…κ³Όμ˜ 차이점:** - **`const`μ™€μ˜ 차이:** `const`λŠ” λ³€μˆ˜ 자체의 μž¬ν• λ‹Ήμ„ λ§‰μ§€λ§Œ 참쑰된 객체의 λ‚΄λΆ€ 속성 변경은 막지 λͺ»ν•©λ‹ˆλ‹€. 반면 `readonly`λŠ” λ³€μˆ˜ 바인딩이 μ•„λ‹Œ 객체 μ†μ„±μ΄λ‚˜ λ°°μ—΄ μš”μ†Œ 자체의 변경을 μ œν•œν•©λ‹ˆλ‹€[10, 11]. - **`Object.freeze()`μ™€μ˜ 차이:** `Object.freeze()`λŠ” λŸ°νƒ€μž„μ— 객체λ₯Ό λ™κ²°ν•˜λ©° μ‹€ν–‰ μ„±λŠ₯에 λΉ„μš©μ„ μ²­κ΅¬ν•˜μ§€λ§Œ, `readonly`λŠ” 컴파일 νƒ€μž„μ— νƒ€μž… μ‹œμŠ€ν…œμ„ ν†΅ν•΄μ„œλ§Œ μˆ˜μ •μ„ κΈˆμ§€ν•©λ‹ˆλ‹€[4, 12]. - **λ°°μ—΄μ—μ„œμ˜ ν™œμš©:** 객체뿐만 μ•„λ‹ˆλΌ 배열에도 `ReadonlyArray` λ˜λŠ” `readonly T[]` ν˜•νƒœλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€[13, 14]. μ΄λ ‡κ²Œ μ„ μ–Έλœ 배열은 μš”μ†Œμ˜ μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•  뿐만 μ•„λ‹ˆλΌ, `push()`, `pop()` λ“± 원본을 μˆ˜μ •ν•˜λŠ” λ©”μ„œλ“œκ°€ νƒ€μž… μ •μ˜μ—μ„œ μ™„μ „νžˆ μ œκ±°λ©λ‹ˆλ‹€[15, 16]. - **ν•œκ³„μ  및 우회 취약점 (Gotcha):** - **얕은 λΆˆλ³€μ„±(Shallow Immutability):** `Readonly`λŠ” 1단계 깊이의 μ†μ„±μ—λ§Œ μž‘μš©ν•©λ‹ˆλ‹€. 객체 λ‚΄λΆ€μ˜ μ€‘μ²©λœ 객체 속성은 μ—¬μ „νžˆ μˆ˜μ •μ΄ κ°€λŠ₯ν•˜λ©°, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ§€ν•‘λœ νƒ€μž…κ³Ό 쑰건뢀 νƒ€μž…μ„ κ²°ν•©ν•œ μ»€μŠ€ν…€ `DeepReadonly` μœ ν‹Έλ¦¬ν‹°λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€[5, 6, 17]. - **에일리어싱(Aliasing) 문제:** `readonly` νƒ€μž…μ˜ 데이터λ₯Ό, μˆ˜μ • κ°€λŠ₯ν•œ νƒ€μž…(mutable)을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” ν•¨μˆ˜μ— 전달할 경우 νƒ€μž… ν˜Έν™˜μ„± κ·œμΉ™μ— μ˜ν•΄ 톡과될 수 μžˆμŠ΅λ‹ˆλ‹€. 이둜 인해 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 원본 데이터가 λ³€κ²½λ˜λŠ” 우회 λŒμ—°λ³€μ΄κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€[18, 19]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[λΆˆλ³€μ„±(Immutability)]], [[λ§€ν•‘λœ νƒ€μž…(Mapped Types)]], [[DeepReadonly]] - **Projects/Contexts:** λ³€κ²½ λΆˆκ°€ν•œ μ™ΈλΆ€ API 응닡 데이터 λͺ¨λΈλ§, μƒνƒœ 관리 μ‹œμŠ€ν…œ(Redux λ¦¬λ“€μ„œ λ“±)의 데이터 무결성 보μž₯, 그리고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „μ—­ ν™˜κ²½ μ„€μ •(Configuration) 객체 보호 λ§₯λ½μ—μ„œ κ΄‘λ²”μœ„ν•˜κ²Œ μ“°μž…λ‹ˆλ‹€[8, 17]. - **Contradictions/Notes:** TypeScript의 에일리어싱 ν•œκ³„λ‘œ 인해 `readonly` 데이터가 `mutable` νƒ€μž…μ„ μš”κ΅¬ν•˜λŠ” ν•¨μˆ˜λ‘œ μ „λ‹¬λ˜μ–΄ λ‚΄λΆ€μ—μ„œ 값이 변경될 μœ„ν—˜μ΄ μ‘΄μž¬ν•˜λ―€λ‘œ, μ™„μ „ν•œ λΆˆλ³€μ„±μ„ μ§€ν‚€λ €λ©΄ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜ μ „λ°˜μ— 걸쳐 읽기 μ „μš© νŒŒλΌλ―Έν„°λ₯Ό κ°•μ œν•˜κ±°λ‚˜ λ°μ΄ν„°μ˜ 볡사본을 λ„˜κΈ°λŠ” 섀계가 ν•„μš”ν•©λ‹ˆλ‹€[18, 19]. λ˜ν•œ, λͺ¨λ“  `readonly` 속성을 λ‹€μ‹œ μˆ˜μ • κ°€λŠ₯ν•˜κ²Œ λ˜λŒλ €μ•Ό ν•  λ•ŒλŠ” `Mutable`μ΄λΌλŠ” μ»€μŠ€ν…€ 헬퍼 νƒ€μž…μ„ λ§Œλ“€μ–΄ λ§€ν•‘ μˆ˜μ‹μ–΄λ₯Ό 제거(`-readonly`)ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€[6]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/Readonly μœ ν‹Έλ¦¬ν‹° νƒ€μž….md]] ---