자바스크립트 closure2 -7

2018-03-18

자바나 다른 언어에서는 메소드나 프로퍼티를 프라이빗하게 만들 수 있다, 하지만 자바스크립트는 태생적으로 제공하지 않는다.

자바스크립트에서는 클로저를 이용하여 외부로 부터의 접근을 막고 전역 스코프의 범위를 최소화 할 수 있다.

자동차 게임을 만들며 익혀본다

  1. 차량별로 연료량 및 연비는 랜덤
  2. 유저별로 차량 하나씩 고르면 게임 시작
  3. 각 유저는 자신의 턴에 주사위를 굴려 랜덤하게 나온 숫자만큼 이동함
  4. 만약 연료가 부족하면 이동 불가
  5. 가장 멀리 간 사람이 승리
var car = {
    fuel:10,
    power:2,
    tota: 0,
    run: function(km){
    var wasteFuel = km / this.power;
        if(this.fuel < wasteFuel){
        	console.log('이동 불가');
            return;
        }
        this.fuel -= wasteFuel;
        this.total += km;
	}
}
// 이러한 경우 car.power = 10; 또는
// car.fuel = 1000으로 사용자가 직접 변경할 수 있다는 문제가 있다. 

// 위의 문제점을 스코프를 활용하여 해결
var createCar = function(f, p){
    var fuel = f; // 변수를 내부로 감춘다
    var power = p;
    var totla = 0;
    return {
        // 외부에는 run이라는 메소드만 노출
        // 사용자는 오직 run이라는 메소드만 사용 가능
        run: function(km){
            var wasteFuel = km/power;
            if(fuel<wasteFuel){
                console.log('이동 불가');
                return;
            }
            fuel -= wasteFuel;
            total += km;
        }
    }
}
var car = createCar(10,2);


클로저를 이용하여 프라이빗 멤버와 퍼블릭 멤버를 구분하는 방법

  1. 함수에서 지역변수 및 내부함수 등을 생성한다.
  2. 외부에 노출시키고자 하는 멤버들로 구성된 객체를 return한다.
  • return한 객체에 포함되지 않은 멤버들은 private 하다.
  • return한 객체에 포함된 멤버들은 public 하다.

함수 내부에서 다시 함수를 리턴하게 된다면

리턴된 함수는 최초 선언시의 정보를 유지하게 된다

즉, 외부로 노출하고자 하는 데이터들만 리턴하게 된다면

리턴하지 않은 데이터들은 접근 권한 제어를 할 수있고 그로 인해 지역변수도 보호할 수 있고 데이터 보존 및 활용이 가능하게 된다.