자바스크립트 변수의 클로저

자바스크립트는 매우 유연한 프로그래밍 언어로, 클로저(closure)라는 강력한 개념을 제공합니다. 클로저는 변수와 그 변수가 정의된 환경을 함께 기억하여 접근할 수 있게 해줍니다. 이로 인해 변수를 다른 함수의 외부에서도 사용할 수 있게 됩니다.

클로저의 개념

클로저는 내부 함수가 외부 함수의 변수에 접근할 수 있는 현상을 의미합니다. 내부 함수는 외부 함수의 스코프에 접근할 수 있지만, 그 반대는 성립하지 않습니다. 따라서, 외부 함수는 내부 함수의 접근을 통해 자신의 변수를 보호할 수 있습니다.

아래의 예제 코드를 통해 클로저의 개념을 이해해보겠습니다.

function outerFunction() {
  let count = 0;

  function innerFunction() {
    count++;
    console.log(count);
  }

  return innerFunction;
}

const closureFunc = outerFunction();
closureFunc(); // 1
closureFunc(); // 2

위의 코드에서 outerFunctioninnerFunction을 반환합니다. 이때, outerFunction의 변수 countinnerFunction에서 접근할 수 있습니다. closureFuncinnerFunction의 참조를 가지고 있으며, 실행 시마다 count를 증가시키고 출력합니다.

클로저의 활용

클로저는 다양한 상황에서 유용하게 활용될 수 있습니다. 여기서는 몇 가지 클로저의 활용 사례를 소개하겠습니다.

정보 은닉

클로저를 사용하면 변수를 외부로부터 은닉할 수 있습니다. 예를 들어, 아래의 코드에서 counter 변수는 외부에서 직접 접근할 수 없으며, 오직 increase 함수를 통해서만 값을 변경할 수 있습니다.

function counter() {
  let count = 0;

  function increase() {
    count++;
    console.log(count);
  }

  return increase;
}

const myCounter = counter();
myCounter(); // 1
myCounter(); // 2

비동기 작업 처리

클로저는 비동기 작업을 간편하게 처리할 수 있도록 돕습니다. 아래의 예제에서는 setTimeout 함수를 사용하여 비동기적으로 메시지를 출력하는 createDelayedMessage 함수를 만들었습니다.

function createDelayedMessage(message, delay) {
  return function() {
    setTimeout(function() {
      console.log(message);
    }, delay);
  };
}

const delayedHello = createDelayedMessage('Hello, world!', 1000);
delayedHello(); // 1초 후에 'Hello, world!' 출력

클로저를 사용하여 setTimeout 함수 내에서 message 값을 유지하고, 원하는 시간만큼 딜레이 후에 메시지를 출력할 수 있습니다.

마무리

클로저는 자바스크립트에서 강력한 기능으로, 변수의 보호와 비동기 작업 처리 등 다양한 상황에서 유용하게 활용될 수 있습니다. 클로저를 효과적으로 사용하여 코드를 작성하면 더욱 유지 보수가 쉽고 강력한 프로그램을 구현할 수 있습니다.