[자바스크립트]

[JavaScript/DeepDive]24.클로저(2)

ki7348 2021. 5. 29. 11:48
  • [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 변수가 재차 초기화될 일은 없다.
  • 이처럼 클로저는 상태가 의도치 않게 변경되지 않도록 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하여 상태를 안전하게 변경하고 유지하기 위해 사용된다.

 

 

 

  • [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 변수의 상태가 유지되지 않는 문제점이 존재한다.