"'이거 내 거' 말하는 4가지 방법. 3개가 TypeScript 전용; 하나가 JavaScript."
4개 modifier
- `public` (default): 어디서나 접근 가능. Default 라서 명시 거의 안 써.
- `protected`: 이 class 와 subclass 에서 접근 가능, 외부 안 됨.
- `private` (TypeScript): TypeScript-only privacy — compile-시점 강제. Runtime 엔 property 가 `obj['name']` 통해 접근 가능한 일반 property.
- `#private` (JavaScript): 진짜 private 문법. 숨겨진 slot 통한 runtime-강제. 외부 접근 시도가 parse 시점 SyntaxError 또는 runtime TypeError.
어느 거 써
새 TypeScript 코드엔: 진짜 private 필드, 특히 민감한 거 (auth token, internal handle, raw 메모리) 엔 `#private` 선호. 우회 못 함.
기존 코드엔: `private` 괜찮음 — compile-시점 contract 가 대부분 정당한 접근 실수 잡음. 더 강한 보장 원할 때 `#private` 로 migration 기계적.
상속 체인엔: subclass 가 필요한데 외부 caller 가 보면 안 되는 필드/method 엔 `protected`. Framework base class 의 흔한 패턴.
작동하는 default: 대부분 필드가 `private` (또는 `#private`) 여야. 대부분 method 가 `public` 이어야. `protected` 가 드문 중간 ground. 어디서나 public default 는 너무 leaky; 어디서나 private default 는 너무 제한적.