_를 활용한 클래스의 외부 접근 제한

Goody·2021년 1월 15일
0

자바스크립트

목록 보기
1/13

클래스의 속성과 메소드들은 폐쇄적일까?

일단 코드부터 보자.

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 프로퍼티를 바꿀 수 있다. 그러나 우리가 코딩을 할 때, 의도한 바가 아니고서야 인스턴스 이름 뒤에 ._ 를 함께 붙일 일은 없어보인다.

0개의 댓글