자바계열이나 C계열 언어(자바스크립트도 C계열이지만 예외입니다.)의 멤버들에게는 접근 지정자
라고 하는 키워드가 있습니다. public
, protected
, private
세가지인데요. 이들은 객체 내부의 멤버에 대해서 외부에서 접근할 수 있는 권한을 부여하는 키워드입니다.
우리가 주목해야할 것은 ptrotected와 private인데요. private
멤버는 간단히 말해 클래스, 객체 내부에서만 접근할 수 있고 외부나 상속받은 객체에서는 접근을 불가능하게 만들어주는 요소입니다. 객체는 당연히 외부에서 쉽게 접근을 허용하면 안되기 때문에 일반적으로 대부분의 프로퍼티와 일부 메소드들은 private로 설정하는 편입니다. 그리고 protected
는 상속받는 객체에서만 멤버에 접근할 수 있게 만들어주는 접근 지정자입니다. 참고로 public
은 어디에서나 접근할 수 있는 접근 지정자입니다.
public | protected | private | |
---|---|---|---|
클래스 외부 | O | X | X |
상속받은 클래스 | O | O | X |
클래스 내부 | O | O | O |
하지만 자바스크립트에는 이런 접근 지정자 키워드가 존재하지 않습니다. 이 말은 모든 멤버 변수와 함수가 기본값인 public으로 설정되어 있어 모두에게 공개되어있다라고 할 수 있습니다. 이것은 은닉성을 저해하고 코딩 과정에서 실수를 불러 일으킬 수 있기에 이 접근지정자에 대한 문법을 내게되었습니다.
그렇다면 자바스크립트에서 protected
멤버는 어떻게 정의할까요?
자바스크립트에서 protected
멤버를 정의하기 위해서 프로그래머 사이의 암묵적 약속을 이용합니다. 바로 protected
멤버로 정의하고 싶은 프로퍼티, 메소드 앞에 언더바_
를 붙이는 것 입니다. 외부에서 protected 프로퍼티에 접근할 때는 getter/setter를 통해 접근합니다.
class Student {
constructor(name, id) {
//protected 프로퍼티들
this._name = name;
this._id = id;
}
//public 메소드
getName() {
return this._name;
}
//protected 메소드
_setName(name) {
this._name = name;
}
}
이때 setter없이 getter만 만들어준다면, 해당 클래스를 읽기전용으로 만들 수 있습니다.
앞에서본 언더바를 이용한 protected
멤버는 정식 문법도 아니고, 프로그래머 사이의 암묵적 약속이라면, private
멤버는 정식 문법으로 지원하고 있습니다. 이 문법은 ES10에서 추가되었습니다. 그 전까지는 proteced
멤버를 암묵적으로 private
멤버로 이용하고 있었습니다.
private
멤버 정의는 멤버 앞에 #
을 붙여서 선언합니다.
class Student {
constructor(name, id) {
//private 프로퍼티들
this.#name = name;
this.#id = id;
}
//public 메소드
getName() {
return this.#name;
}
//private 메소드
#setName(name) {
this.#name = name;
}
}