---
id: P-REINFORCE-AUTO-E98170
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)
> 지식 요약 정보 추출 중...

## 📖 구조화된 지식 (Synthesized Content)
* **컴파일 타임의 불변성 강제**
  `readonly` 수식어는 속성이 초기화된 후 재할당되거나 수정되는 것을 방지한다 [3]. 구조적 타입 검사 시 해당 속성의 변이(Mutation) 연산을 시그니처에서 배제함으로써, 컴파일러가 값의 수정을 미리 포착해 에러를 발생시킨다 [8]. 

* **`const` 및 `Object.freeze()`와의 차별점**
  * **대상과 범위:** `const`는 변수 자체의 재할당을 막을 뿐 객체 내부 속성의 변이는 막지 못하지만, `readonly`는 변수가 아닌 객체의 속성(Property)에 직접 적용되어 내용물의 할당을 막는다 [9-11].
  * **동작 시점과 성능:** `Object.freeze()`는 런타임에 작동하며 성능 비용을 수반하는 반면, `readonly`는 컴파일 타임에만 작동하여 런타임 성능 오버헤드가 전혀 발생하지 않는다 [5, 11, 12].

* **배열과 튜플의 보호**
  배열이나 튜플의 경우 `readonly T[]` 또는 `ReadonlyArray<T>` 구문을 사용하여 불변으로 만들 수 있다 [13-15]. 이렇게 선언된 배열은 `push()`, `pop()` 등 배열의 내용을 변이시키는 메서드들이 타입 정의에서 완전히 제거되어 안전한 데이터 전달을 보장한다 [15, 16]. 

* **얕은 불변성과 깊은 불변성(Deep Readonly)**
  `readonly` 키워드나 내장된 `Readonly<T>` 유틸리티 타입은 객체의 최상위 속성만 보호하는 얕은(Shallow) 불변성만 제공하며 중첩된 객체의 변경은 막지 못한다 [17-19]. 완전히 중첩된 구조까지 불변하게 만들려면, 매핑된 타입과 조건부 타입을 결합한 재귀적 유틸리티 타입인 `DeepReadonly<T>`를 별도로 정의하여 사용해야 한다 [18-20].

* **별칭(Aliasing)으로 인한 한계 및 주의점**
  `readonly` 데이터는 자신을 가리키는 직접적인 참조에 대해서만 불변을 보장한다. 만약 `readonly`가 적용된 데이터를 가변 파라미터를 받는 함수에 전달할 경우 타입 호환성 규칙에 의해 허용될 수 있으며, 이로 인해 별칭(Alias)을 통한 우회적인 객체 변이가 발생할 수 있다 [21, 22]. 이러한 문제를 방지하려면 함수 시그니처 설계 시 파라미터에도 `readonly`를 일관되게 명시해야 한다 [23].

## ⚠️ 모순 및 업데이트 (Contradictions & RL Update)
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
- **정책 변화:** Programming & Language 분야의 자동 자산화 수행.

## 🔗 지식 연결 (Graph)
- **Related Topics:** `[[불변성(Immutability)]]`, `[[ReadonlyArray]]`, `[[Utility Types]]`, `[[구조적 타이핑(Structural Typing)]]`
- **Projects/Contexts:** `[[상태 관리(State Management) 및 리듀서(Reducers)]]`, `[[API 응답 및 환경 설정 모델링]]`
- **Contradictions/Notes:** `readonly`는 타입 레벨에서 완벽한 불변성을 보장하는 것처럼 보이지만, TypeScript의 타입 호환성(별칭 문제)으로 인해 파라미터로 넘겨진 곳에서 의도치 않게 값이 변경되는 구멍이 발생할 수 있다 [21]. 또한 중첩된 객체를 기본적으로 보호하지 않으므로 구조가 복잡할 때는 사용자 정의 `DeepReadonly`가 필수적으로 요구된다 [18].

---
*Last updated: 2026-04-18*
- Raw Source: [[00_Raw/2026-04-20/readonly 수식어.md]]
---
