Files
2nd/01_Archive/2026-04-20/readonly 수식어.md
T

3.7 KiB

id, category, confidence_score, tags, last_reinforced, github_commit
id category confidence_score tags last_reinforced github_commit
P-REINFORCE-AUTO-E98170 10_Wiki/💡 Topics/Programming & Language 0.90
auto-reinforced
2026-04-20 [P-Reinforce] Continuous Worker - readonly 수식어

readonly 수식어

📌 한 줄 통찰 (The Karpathy Summary)

지식 요약 정보 추출 중...

📖 구조화된 지식 (Synthesized Content)

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

  • constObject.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