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

4.3 KiB

id, category, confidence_score, tags, last_reinforced, github_commit
id category confidence_score tags last_reinforced github_commit
P-REINFORCE-AUTO-647D86 10_Wiki/💡 Topics/Programming & Language 0.90
auto-reinforced
2026-04-20 [P-Reinforce] Continuous Worker - 불변성(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)


Last updated: 2026-04-18

  • Raw Source: 00_Raw/2026-04-20/불변성(Immutability).md