본문 바로가기
C.W.K.
Stream
Lesson 02 of 06 · published

접근 제한자: 공개 계약과 내부 상태 나누기

~9 min · classes, access-modifiers, encapsulation

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"보이지 않게 하는 것과, 실행 중에도 접근을 막는 것은 같은 약속이 아니야."

public, protected, private

아무 표시가 없는 클래스 멤버는 기본적으로 public이야. private은 그 클래스를 선언한 TypeScript 코드 안에서만 접근하게 하고, protected는 클래스와 하위 클래스까지 허용해. 이 제한은 컴파일 단계의 계약이라 보통 JavaScript 출력에는 별도 장벽이 생기지 않아.

JavaScript의 #private 필드

#token처럼 해시로 시작하는 필드는 JavaScript 자체의 비공개 필드야. 클래스 바깥에서 문법적으로 접근할 수 없고, 실행 중에도 경계가 유지돼. 반면 TypeScript의 private token은 타입 검사를 우회한 JavaScript에서는 보일 수 있어.

런타임 격리가 실제 요구사항이면 #private가 더 정직해. 다만 디버깅과 직렬화, 테스트 대역을 만드는 방식에도 영향을 주므로 습관처럼 모든 필드를 감추기보다 외부에 보장할 계약을 먼저 정해.

제한자는 구현을 숨기는 장식이 아니라 변경 가능한 범위를 선언하는 도구야. 컴파일 단계만 막으면 되는지, 런타임 경계까지 필요한지 구분해서 골라.

Code

4 modifier in action·typescript
class BankAccount {
  // TypeScript private — compile-시점만.
  private _balance: number = 0;

  // JavaScript private — runtime 강제.
  #internalToken: string = '';

  // Public method.
  deposit(amount: number): void {
    this._balance += amount;
  }

  // Read-only 접근용 public accessor.
  get balance(): number {
    return this._balance;
  }

  // Protected — subclass 가 쓸 수.
  protected validateAmount(amount: number): boolean {
    return amount > 0 && amount < 1_000_000;
  }
}

class SavingsAccount extends BankAccount {
  applyInterest(rate: number): void {
    if (this.validateAmount(rate)) {     // ✅ subclass 에서 protected 접근
      // this._balance 직접 접근 못 함 — parent-private
      this.deposit(this.balance * rate);
    }
  }
}

const acc = new BankAccount();
acc.balance;                     // ✅ public getter
// acc._balance;                 // ❌ private
// acc.#internalToken;           // ❌ SyntaxError — # 가 class 안에서만
// acc['_balance']               // ⚠️ runtime 에 TypeScript-private 접근

External links

Exercise

#password 필드와 암호 추가·일치 확인 메서드를 가진 PasswordVault를 만들어. 클래스 밖과 하위 클래스에서 필드에 접근할 수 없는지 확인해.
Hint
해시 비공개 필드는 선언한 클래스 안에서만 접근할 수 있어. 외부 코드와 하위 클래스 모두에서 막히는 런타임 경계라는 점이 TypeScript private와 달라.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.