자바스크립트 클로저(Closure)

자바스크립트 클로저는 자바스크립트의 중요한 개념 중 하나입니다. 클로저는 함수와 함수가 선언된 어휘적 환경(Lexical environment)의 조합을 말합니다. 간단히 말해서, 함수가 자신이 생성된 시점의 환경을 “기억”하고 있어서, 그 함수가 실행될 때에도 자신이 생성된 환경에 접근할 수 있는 것입니다.

클로저의 개념

자바스크립트에서는 함수가 실행 컨텍스트(Execution Context)를 가집니다. 실행 컨텍스트는 해당 함수가 실행되는 동안 필요한 변수들과 값을 담고 있는 “환경”에 대한 정보를 담고 있습니다. 이때, 함수가 호출될 때마다 새로운 실행 컨텍스트가 생성되는데, 이 환경 정보는 함수로부터 생성된 클로저와 연결됩니다.

간단한 예시로 살펴보겠습니다.

function outer() {
  var outerVar = 'I am outer';

  function inner() {
    var innerVar = 'I am inner';
    console.log(outerVar + ', ' + innerVar);
  }

  return inner;
}

var closure = outer();
closure(); // I am outer, I am inner

위 예시에서 inner 함수는 outer 함수 내부에서 정의되었고, outer 함수가 호출되면서 inner 함수를 반환하고 있습니다. 이때 inner 함수는 outer 함수가 종료된 이후에도, outer 함수 내부의 변수에 접근할 수 있게 되는데, 이것이 바로 클로저의 핵심입니다.

클로저의 활용

클로저는 다양한 상황에서 유용하게 활용될 수 있습니다. 예를 들어, Private 변수를 구현하기 위해 클로저를 사용할 수 있습니다. 아래 예시를 살펴보세요.

function Counter() {
  var count = 0;

  return {
    increment: function() {
      count++;
    },
    decrement: function() {
      count--;
    },
    getValue: function() {
      return count;
    }
  };
}

var counter = Counter();
console.log(counter.getValue()); // 0
counter.increment();
console.log(counter.getValue()); // 1
counter.decrement();
console.log(counter.getValue()); // 0

위 예시에서 Counter 함수는 count변수를 포함하는 클로저를 반환합니다. 이렇게 하면 count 변수는 외부에서 접근할 수 없는 Private 변수가 되고, increment, decrement, getValue 메소드를 통해 count 변수의 값을 조작할 수 있게 됩니다.

결론

클로저는 자바스크립트에서 매우 강력하고 유용한 개념입니다. 클로저를 잘 이해하고 활용한다면, 다양한 상황에서 코드를 더욱 유연하고 간결하게 작성할 수 있습니다. 클로저는 함수형 프로그래밍과 관련된 개념이기도 하니, 자바스크립트 개발자라면 꼭 알아두시기 바랍니다.