ES6에서 클래스가 도입됐을 때, 클래스 내부에서 필드를 선언하는 표준 문법은 없었다. 따라서 클래스 안에서 인스턴스 프로퍼티를 정의하려면, 보통 다음과 같은 방식으로 생성자 내부에서 선언했다.
class Person {
constructor(name) {
this.name = name; // 명시적인 public 필드
}
getName() {
return this.name;
}
}
this.name
은 외부에서도 personInstance.name
으로 얼마든지 접근할 수 있으므로 사실상 public 프로퍼티다.다른 객체지향 언어(예: Java, C++, C# 등)에는 public
, private
, protected
등 접근 제한자가 있어, 클래스 내부/외부/상속 관계에 따라 접근을 제한할 수 있었다.
JS에서는 전통적으로 명시적인 접근 제한 키워드가 제공되지 않았다. 그래서 ES6 이후에도 유효 범위(스코프)를 활용하거나 심볼(Symbol), WeakMap 등을 활용하여 우회적으로 “비공개” 속성을 에뮤레이션하곤 했다.
public
과 private
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)
name = '홍길동';
처럼 선언하면 public 필드로 간주된다.public
키워드를 따로 붙이지 않아도 기본적으로 public 이다.