정보를 감추는 목적으로 private 사용하지 않기

JS는 클래스에 비공개 속성을 만들 수 없습니다. 비공개 속성임을 나타내기 위해 언더스코어(_)로 접두사를 붙이는 것이 관례로 인정될 뿐, 실제로는 일반적인 속성일 뿐입니다.

헌데 TS에는 public, protected, private 접근 제어자가 있기 때문에, 이를 통해 공개 규칙을 강제할 수 있는 것으로 오해할 수 있습니다.

class Diary { private secret = 'cheated on my English test'; } const diary = new Diary(); diary.secret // ~~~~~~ Property 'secret' is private and only // accessible within class 'Diary'

헌데 이러한 접근 제어자들은 TS 키워드일 뿐, 컴파일 이후에는 제거되며, 그 결과 다음처럼 일반적인 JS 속성이 됩니다.

class Diary { constructor() { this.secret = 'cheated on my English test'; } } const diary = new Diary(); diary.secret;

TS 접근 제어자들은 단지 컴파일 시점에만 오류를 표시해줄 뿐, 언더스코어 관례와 마찬가지로 런타임에는 아무런 효력이 없습니다.

JS 및 TS에서 정보를 숨기기 위해 가장 효과적인 방법은 클로저를 사용하는 것입니다. 해당 챕터에서 클로저에 대해 깊게 다루기엔 범주를 벗어나므로, 여기를 참조하도록 합시다.

또 다른 선택지로는 비공개 필드 기능을 사용할 수 있습니다. 비공개 필드는 접두사로 #를 붙여서 타입 체크와 런타임 모두에서 비공개로 만드는 역할을 합니다.

class PasswordChecker { #passwordHash: number; constructor(passwordHash: number) { this.#passwordHash = passwordHash; } checkPassword(password: string) { return hash(password) === this.#passwordHash; } }

해당 기능은 기존에(해당 책이 작성될 시점에도) 표준화가 진행 중인 단계였으나, ES2022에 접어들면서 공식적인 스펙이 되었습니다.