---
id: [[P-Reinforce|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|readonly]] Type"
---

# [[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<T>` 유틸리티 타입:** 
  TypeScript는 기존 객체 타입의 모든 속성을 읽기 전용으로 변환해 주는 `Readonly<T>` 내장 유틸리티 타입을 제공합니다[2, 10]. 만약 `readonly` 속성을 다시 가변(mutable) 상태로 되돌리고 싶다면, 매핑된 타입(Mapped Type) 구문에서 `-readonly` 제어자를 사용하여 속성을 제거할 수 있습니다[11].
* **배열과 튜플의 불변성:** 
  배열이나 튜플에 `readonly` 제어자를 붙이거나 `ReadonlyArray<T>`를 사용하면, 배열을 변이시키는 `push`, `pop`과 같은 메서드가 타입 시그니처에서 제거되어 원천적으로 사용이 차단됩니다[12, 13]. 단, `map`이나 `filter` 같이 원본을 수정하지 않고 새로운 배열을 반환하는 메서드는 그대로 사용할 수 있습니다[12].
* **얕은 불변성(Shallow Immutability)의 한계:** 
  기본적인 `readonly` 제어자와 `Readonly<T>` 타입은 최상위 속성에만 적용되는 얕은(shallow) 수준의 보호만 제공하여 중첩된 객체 내부는 여전히 변경될 수 있습니다[4, 5, 14]. 이를 해결하기 위해 매핑 타입과 조건부 타입을 결합하여 재귀적으로 속성을 동결하는 `[[DeepReadonly|DeepReadonly]]<T>` 커스텀 타입을 직접 정의하여 사용해야 합니다[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|DeepReadonly]], Object.freeze(), Mapped Types
- **Projects/Contexts:** [[Functional Programming|Functional Programming]], State [[Management|Management]]
- **Contradictions/Notes:** 자바스크립트의 `const`는 변수 자체의 재할당을 막고 객체 내부 속성의 변경은 허용하지만, TypeScript의 `readonly`는 객체 내부 속성의 변경을 막습니다[4, 19]. 또한 `Object.freeze()`는 런타임에 얕은 동결을 수행하지만, `readonly`는 런타임 성능 비용 없이 컴파일 타임에만 엄격하게 검사한다는 차이가 있습니다[5, 20, 21]. 

---
*Last updated: 2026-04-18*

---
