class Person {
  // (선택) 퍼블릭 필드
  name = "Anonymous";

  // (선택) 프라이빗 필드(외부 접근 불가)
  #ssn = "000000-0000000";

  // 생성자: 인스턴스 생성 직후 1회 호출
  constructor(name, ssn) {
    if (name) this.name = name;
    if (ssn)  this.#ssn = ssn;
  }

  // 인스턴스 메서드(프로토타입에 저장됨, 모든 인스턴스가 공유)
  greet() {
    return `안녕하세요, 저는 ${this.name}입니다.`;
  }

  // 게터/세터: 속성처럼 접근하면서 로직 개입
  get maskedSsn() {
    return this.#ssn.replace(/\\d(?=\\d{4})/g, "*");
  }
  set rename(next) {
    this.name = String(next).trim();
  }

  // 정적 메서드: 인스턴스가 아니라 클래스에서 호출
  static isPerson(x) {
    return x instanceof Person;
  }
}

const p = new Person("Kim", "901010-1234567"); //생성자에 들어갈 인자
p.greet();          // "안녕하세요, 저는 Kim입니다."
p.maskedSsn;        // "******-***4567"
Person.isPerson(p); // true