"보이지 않게 하는 것과, 실행 중에도 접근을 막는 것은 같은 약속이 아니야."
public, protected, private
아무 표시가 없는 클래스 멤버는 기본적으로 public이야. private은 그 클래스를 선언한 TypeScript 코드 안에서만 접근하게 하고, protected는 클래스와 하위 클래스까지 허용해. 이 제한은 컴파일 단계의 계약이라 보통 JavaScript 출력에는 별도 장벽이 생기지 않아.
JavaScript의 #private 필드
#token처럼 해시로 시작하는 필드는 JavaScript 자체의 비공개 필드야. 클래스 바깥에서 문법적으로 접근할 수 없고, 실행 중에도 경계가 유지돼. 반면 TypeScript의 private token은 타입 검사를 우회한 JavaScript에서는 보일 수 있어.
런타임 격리가 실제 요구사항이면 #private가 더 정직해. 다만 디버깅과 직렬화, 테스트 대역을 만드는 방식에도 영향을 주므로 습관처럼 모든 필드를 감추기보다 외부에 보장할 계약을 먼저 정해.
제한자는 구현을 숨기는 장식이 아니라 변경 가능한 범위를 선언하는 도구야. 컴파일 단계만 막으면 되는지, 런타임 경계까지 필요한지 구분해서 골라.