자바스크립트 입문_클로저와 메모리 관리

자바스크립트 2021. 5. 9. 13:02

(본 포스팅은 위키북스의 '코어자바스크립트' 책을 공부하면서 작성되었습니다_내돈내산)

 

클로저는 객체지향과 함수형 모두를 아우르는 중요한 개념이다. 메모리 누수의 위험을 이유로 클로저 사용을 조심해야 한다거나 심지어 지양해야 한다고 주장하지만 메모리 소모는 클로저의 본질적인 특성임.

 

  • 메모리 누수: 개발자의 의도와 달리 어떤 값의 참조 카운트가 0이 되지 않아 GC(가비지컬렉터)의 수거 대상이 되지 않는 경우. 
  • 과거에는 의도치 않게 누수가 발생하는 여러가지 상황들이 있었지만, 그중 대부분은 현재의 자바스크립트 엔진에서는 발생하지 않거나 거의 발견이 힘들어 졌으므로 이제는 의도대로 설계한 '메모리 소모'에 대한 관리법만 잘 파악해서 적용하는 것으로 충분함.
  • 관리방법은 매우 간단함. 클로저의 필요성이 사라진 시점에 참조카운트를 0으로 만들어 GC가 수거해갈수 있도록 함. 참조카운트는 식별자에 참조형이 아닌 기본 데이터(보통 null이나 undefined)를 할당하면 됨.

- 클로저의 메모리 관리 -

// (1) return에 의한 클로저의 메모리 해제
let outer = (function() {
  let a = 1;
  const inner = function () {
    return ++a;
  };
  return inner;
})();

console.log(outer());
console.log(outer());
outer = null; // outer 식별자의 inner함수 참조를 끊어버림

// (2) setInterval에 의한 클로저의 메모리 해제
(function() {
  let a = 0;
  let intervalID = null;
  let inner = function() {
    if(++a>=10){
      clearInterval(intervalID);
      inner = null;  // inner 식별자의 함수 참조를 끊음
    };
    console.log(a);
  };
  intervalID = setInterval(inner, 100)
})();
admin