소비자 명단을 관리하고 싶어서 간단하게 이름과 돈을 인자로 받아
인스턴스를 생성하는 클래스를 만들었다.
거기에 추가적으로 고객이 늘어날 때마다(인스턴스가 생성될 때마다) num변수를 1씩 증가시키고자 했다.
let num = 0;
class Consumer {
constructor(name, money) {
this.name = name;
this.money = money;
this.increase();
}
increase() {
return ++num;
}
}
const cs01 = new Consumer("김갑수", 5000);
const cs02 = new Consumer("김철수", 3000);
Consumer Class에 해당하는 대로 인스턴스가 생성되었고
num도 정상적으로 1씩 증가하였다.
문제가 없어 보였으나
num에 대한 접근이 너무 쉬웠다.
const cs01 = new Consumer("김갑수", 5000);
num = 500;
const cs02 = new Consumer("김철수", 3000);
이런 방식으로 사이에 num값이 조정되어버리면 원하는 고객 명수 유지가 잘 되지 않았다.
Consumer 안에서는 따로 var num / let num 등 변수 선언이 불가능 했고,
아래와 같이 increase()메서드 안에서 선언 및 할당을 해주면 increase를 실행할 때마다 반복하여 초기화가 될 것 같았다.
class Consumer {
constructor(name, money) {
this.name = name;
this.money = money;
console.log(this.increase()());
}
increase() {
var num = 0;
return function () {
return ++num;
};
}
}
위의 코드를 log를 찍어보았으나, 예상 했던 것과 같이 increase가 반복 실행되면서 num이 매번 0으로 초기화 되었다가 증가했다가를 반복하였다.
그래서 아에 increase()메서드를 삭제하고 클래스 밖에 increase 함수를 선언해주되,
클로저 방식을 차용하여 increase 함수 실행을 통한 접근 이외의 모든 것을 차단하고자 했다.
class Consumer {
constructor(name, money) {
this.name = name;
this.money = money;
console.log(increase());
}
}
const increase = (function () {
let num = 0;
return function () {
return ++num;
};
})();
const cs01 = new Consumer("김갑수", 5000);
const cs02 = new Consumer("김철수", 3000);
const cs03 = new Consumer("홍길수", 5000);
const cs04 = new Consumer("이수명", 10000);
정리하면 다음과 같다.
Consumer 클래스는 constructor로 name, money 인자 값을 받아와서 인스턴스를 생성해주는 데, 인스턴스 생성 시 console.log(increase());를 통해서 반환값을 찍어준다.
여기서 increase() 함수는 함수 내부에서 let num = 0;으로 선언 및 초기화를 해주지만
외부함수보다 더 오래 유지되는 중첩 함수인 클로저 방식으로 쓰였기 때문에
outer(외부 환경)에 존재하는 num 값이 사라지지 않고 유지 된다.
인스턴스 생성 시에 increase() 함수가 호출 되는데 num 값이 사라지지 않고 유지되므로 고객 수만큼 num값은 중첩되어 증가하고,
increase() 함수를 통한 접근 이외의 접근이 불가능하다.
(전역 변수가 아니기에 외부에서 num = 10 등의 접근이 불가능)