자바스크립트 입문_접근권한제어(정보은닉)
자바스크립트 2021. 5. 9. 16:30(본 포스팅은 위키북스의 '코어자바스크립트' 책을 공부하면서 작성되었습니다_내돈내산)
- 정보은닉(information hiding): 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 현재 프로그래밍 언어의 중요한 개념.
- public: 외부에서 접근 가능
- private: 내부에서만 사용하며 외부에 노출되지 않음.
!! 자바스크립트에는 변수에 이러한 접근권한을 부여하도록 설계되어있지 않지만, 클로저를 이용해 함수차원에서 public한 값과 private한 값을 구분하는 것이 가능함.
- 자동차 객체 생성 -
접근권한을 제어해보며 자동차 객체 만들기
규칙1. 각 턴마다 주사위를 굴려 나온 숫자(km) 만큼 이동한다.
규칙2. 차량별로 연료량(fuel)과 연비(power)는 무작위로 생성된다.
규칙3. 남은 연료가 이동할 거리에 필요한 연료보다 부족하면 이동하지 못한다.
규칙4. 모든 유저가 이동할 수 없는 턴에 게임이 종료된다.
규칙5. 게임 종료 시점에 가장 멀리 이동해 있는 사람이 승리.
let car = {
fuel: Math.ceil(Math.random()*10 +10), // 연료 (L)
power: Math.ceil(Math.random()*3 +2), // 연비 (km/L)
moved: 0, // 총 이동거리
run: function(){
let km = Math.ceil(Math.random()*6);
let wasteFuel = km / this.power;
if (this.fuel < wasteFuel) {
console.log('이동불가');
return ;
}
this.fuel -= wasteFuel;
this.moved += km;
console.log(km + 'km 이동 (총 '+this.moved + 'km)');
}
};
- 위와같은 코드일경우 car 객체 내부에 있는 변수에 접근해서 값을 전부 변경할 수 있게 됨.
ex) car.fuel = 10000, car.power = 100, car.moved = 1000 와 같은 방법 - 이를 막기 위해 객체가 아닌 함수로 만들고 필요한 멤버만을 return 하는 방법으로 클로저를 활용한다.
let createCar = function() {
let fuel = Math.ceil(Math.random() * 10 + 10);
let power = Math.ceil(Math.random() * 3 + 2);
let moved = 0;
return {
get moved() {
return moved;
},
run: function() {
let km = Math.ceil(Math.random() * 6);
let wasteFuel = km/power;
if(fuel < wasteFuel){
console.log('이동불가');
return;
}
fuel -= wasteFuel;
moved += km;
console.log(km + 'km 이동 (총 '+ moved + 'km). 남은 연료: '+fuel);
}
};
};
let car = createCar();
- 위에서 보여준 코드와는 다르게 이번 코드는 fuel, power 변수는 private으로 지정해 외부의 접근을 제한함.
- moved 변수는 get속성만을 주어*(getter)읽기전용 속성을 부여해 수정을 할수 없게 함. 즉 외부에서는 오직 run 메서드를 실행하는 것과 현재의 moved 값을 확인하는 두가지가 작동됨,
<클로저를 활용한 접근권한 제어법>
1. 함수에서 지역변수 및 내부함수 등을 생성한다.
2. 외부에 접근권한을 주고자 하는 대상들로 구성된 참조형 데이터를 return 함.(대상이 여럿일 떄는 객체 또는 배열, 하나일 때는 함수) >> return 한 변수들은 public 상태가 되고, 그렇지 않은 변수는 private상태가 됨)
'자바스크립트' 카테고리의 다른 글
자바스크립트 입문_커링함수(currying function) (0) | 2021.05.09 |
---|---|
자바스크립트 입문_부분적용함수 구현 (0) | 2021.05.09 |
자바스크립트 입문_콜백함수 내부에서 외부 데이터를 사용하고자 할때 (0) | 2021.05.09 |
자바스크립트 입문_클로저와 메모리 관리 (0) | 2021.05.09 |
자바스크립트 입문_클로저의 의미 및 원리 (0) | 2021.05.08 |