Files
2nd/01_Archive/2026-04-20/불변성(Immutability).md

40 lines
4.3 KiB
Markdown

---
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)|불변성(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<T>`를 지정하면 값을 변경하는 메서드(`push`, `pop` 등)의 사용이 타입 시스템에서 완전히 제거된다 [9, 10].
* **얕은(Shallow) 불변성과 깊은(Deep) 불변성:** 내장된 `Readonly<T>` 유틸리티나 기본 `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|readonly]], [[DeepReadonly|DeepReadonly]], [[as const|as const]], [[구조적 타이핑(Structural Typing)|구조적 타이핑(Structural Typing)]]
- **Projects/Contexts:** [[상태 관리(State Management)|상태 관리(State Management)]], [[TypeScript 타입 시스템 및 인터페이스 설계|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
---