1. 전통적인 클래스 속성과 접근 제한


1-1) ES6 이전(혹은 필드 제안 이전)의 클래스 속성 선언 방식

ES6에서 클래스가 도입됐을 때, 클래스 내부에서 필드를 선언하는 표준 문법은 없었다. 따라서 클래스 안에서 인스턴스 프로퍼티를 정의하려면, 보통 다음과 같은 방식으로 생성자 내부에서 선언했다.

class Person {
  constructor(name) {
    this.name = name; // 명시적인 public 필드
  }

  getName() {
    return this.name;
  }
}

1-2) 접근 제한자(Access Modifier)

다른 객체지향 언어(예: Java, C++, C# 등)에는 public, private, protected접근 제한자가 있어, 클래스 내부/외부/상속 관계에 따라 접근을 제한할 수 있었다.

JS에서는 전통적으로 명시적인 접근 제한 키워드가 제공되지 않았다. 그래서 ES6 이후에도 유효 범위(스코프)를 활용하거나 심볼(Symbol), WeakMap 등을 활용하여 우회적으로 “비공개” 속성을 에뮤레이션하곤 했다.

2. 최신 JavaScript(클래스 필드 문법)의 publicprivate


2-1) Public 필드

ECMAScript의 최신 클래스 필드 문법은 다음과 같이 public 필드를 클래스 본문에 직접 선언할 수 있게 한다.

class Person {
  // public 필드
  name = '홍길동';

  constructor(name) {
    if (name) {
      this.name = name;
    }
  }

  sayHello() {
    console.log(`Hello, I'm ${this.name}`);
  }
}

const p = new Person('김철수');
p.sayHello(); // "Hello, I'm 김철수"
console.log(p.name); // "김철수" (외부 접근 가능, public)