클래스의 속성과 메소드들은 폐쇄적일까?
일단 코드부터 보자.
class Car {
constructor(make, model) {
this.make = make,
this.model = model,
this.userGears = ['P','N','R','D'];
this.userGear = this.userGears[0];
}
shift(gear) {
if(this.userGears.indexOf(gear) < 0) {
throw new Error(`Invalid gear: ${gear}`);
}
this.userGear = gear;
}
}
const car1 = new Car("Toyota", "civic");
const car2 = new Car("Hyundai", "genesis");
car1.shift("D");
car2.shift("R");
car1.userGear // "D"
car2.userGear // "R"
위의 코드에서 갑자기 다음과 같이 코드를 입력하면 어떻게 될까?
car1.userGear = "X";
console.log(car1) // Car {make: 'Toyota', model: 'civic', ... , userGear : 'X'}
X
라는 존재하지 않는 기어를 선택하는 일이 벌어진다.
class Car {
constructor(make, model) {
this.make = make,
this.model = model,
this._userGears = ['P','N','R','D'];
this._userGear = this._userGears[0];
}
get userGear() {return this._userGear;}
set userGear(value) {
if(this._userGears.indexOf(value < 0))
throw new Error(`Invalid gear : ${value}`);
this._userGear = value;
}
shift(gear) {this.userGear = gear;}
}
const car1 = new Car("Toyota", "civic");
car1.userGear = "X"; // Uncaught Error: Invalid gear : ${value}
에러와 함께 실행되지 않는다.
사실 위 방법을 써도 car1._userGear = "X"
라고 입력하면 여전히 userGear 프로퍼티를 바꿀 수 있다. 그러나 우리가 코딩을 할 때, 의도한 바가 아니고서야 인스턴스 이름 뒤에 .
과 _
를 함께 붙일 일은 없어보인다.