- [24.4] 클로저의 활용
- 클로저는 상태를 안전하게 변경하고 유지하기 위해 사용한다.
- 다시 말해, 상태가 의도치 않게 변경되지 않도록 상태를 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하기 위해 사용한다.
- 클로저를 사용해서 함수가 호출될 때마다 호출된 횟수를 출력하는 카운터를 만드는 예제
- // 카운트 상태 변경 함수
const increase = ( function ( ) {
// 카운트 상태 변수
let num = 0;
// 클로저
return function ( ) {
// 카운트 상태를 1만큼 증가시킨다.
return ++num;
};
}( ));
console.log(increase( )); // 1
console.log(increase( )); // 2
console.log(increase( )); // 3- 즉시 실행 함수는 호출된 이후 소멸되지만 즉시 실행 함수가 반환한 클로저는 increase 변수에 할당되어 호출된다.
- 즉시 실행 함수는 한 번만 실행되므로 increase가 호출될 때마다 num 변수가 재차 초기화될 일은 없다.
- 즉시 실행 함수는 호출된 이후 소멸되지만 즉시 실행 함수가 반환한 클로저는 increase 변수에 할당되어 호출된다.
- // 카운트 상태 변경 함수
- 이처럼 클로저는 상태가 의도치 않게 변경되지 않도록 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하여 상태를 안전하게 변경하고 유지하기 위해 사용된다.
- [24.5] 캡슐화와 정보 은닉
- 캡슐화는 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작할 수 있는 동작인 메서드를 하나로 묶는 것을 말한다.
- 캡슐화는 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용하기도 하는데 이를 정보 은닉이라고 한다.
- 정보 은닉은 외부에 공개할 필요가 없는 구현의 일부를 외부에 공개되지 않도록 감추어 적절치 못한 접근으로부터 객체의 상태가 변경되는 것을 방지해 정보를 보호하고, 객체 간의 상호 의존성, 즉 결합도를 낮추는 효과가 있다.
- const Person = (function ( ) {
let _age = 0; // private
// 생성자 함수
function Person(name, age) {
this.name = name; // public
_age = age;
}
// 프로토타입 메서드
Person.prototype.sayHi = function ( ) {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
// 생성자 함수를 반환
return Person;
}( ));
const me = new Person('Lee', 20);
me.sayHi( ); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
const you = new Person('Kim', 30);
you.sayHi( ); // Hi! My name is Kim. I am 30.
console.log(you.name); // Kim
console.log(you._age) // undefined - 즉시 실행 함수가 반환하는 Person 생성자 함수와 Person 생성자 함수의 인스턴스가 상속받아 호출할 Person.prototype.sayHi 메서드는 즉시 실행 함수가 종료된 이후 호출된다.
- 하지만 Person 생성자 함수와 sayHi 메서드는 이미 종료되어 소멸한 즉시 실행 함수의 지역 변수 _age를 참조할 수 있는 클로저다.
- Person 생성자 함수가 여러 개의 인스턴스를 생성할 경우 _age 변수의 상태가 유지되지 않는 문제점이 존재한다.
- 하지만 Person 생성자 함수와 sayHi 메서드는 이미 종료되어 소멸한 즉시 실행 함수의 지역 변수 _age를 참조할 수 있는 클로저다.
'[자바스크립트]' 카테고리의 다른 글
[JavaScript/DeepDive]25.클래스(2) (0) | 2021.05.31 |
---|---|
[JavaScript/DeepDive]24.클래스(1) (0) | 2021.05.30 |
[JavaScript/DeepDive]24.클로저(1) (0) | 2021.05.29 |
[JavaScript/Deepdive]23.실행 컨텍스트(2) (0) | 2021.05.27 |
[JavaScript/DeepDive]23.실행 컨텍스트(1) (0) | 2021.05.27 |