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

찌끅·2024년 8월 5일

클로저(Closure)

클로저(Closure)는 자바스크립트에서 매우 중요한 개념으로, 함수와 그 함수가 선언된 렉시컬 환경(Lexical Environment)을 함께 기억하는 기능을 말한다. 클로저는 함수가 자신이 정의된 스코프 외부에서 호출될 때에도, 자신이 선언될 당시의 렉시컬 환경을 "기억"하고, 해당 환경에 접글할 수 있는 매커니즘을 제공한다.

클로저의 정의와 원리

클로저는 함수가 생성될 때, 함수와 함께 생성된 렉시컬 환경을 함께 캡처하고, 그 함수의 내부에서 접근 가능한 모든 변수, 함수 등을 포함한다. 이로 인해 함수가 호출될 때마다 해당 환경에 접근할 수 있다.

클로저가 생성되는 이유는 자바스크립트의 함수가 일급 객체(First-Class Object)이기 때문이다. 자바스크립트에서는 함수가 변수에 할당될 수 있고, 다른 함수의 인자로 전달되거나 반환될 수 있다. 이러한 기능을 구현하기 위해, 함수가 선언된 렉시컬 환경을 기억할 필요가 생기는데, 이 역할을 하는 것이 클로저이다.

클로저 예제

function outerFunction() {
  let outerVariable = 'I am outside!';
  
  function innerFunction() {
    console.log(outerVariable);
  }
  
  return innerFunction;
}

const closureFunction = outerFunction();
closureFunction(); // "I am outside!"
  1. outerFunction: outerVariable이라는 변수를 선언하고, innerFunction을 정의한 뒤 반환한다.
  2. innerFunction: outerVariable에 접근하여 그 값을 출력하는 함수이다.
  3. outerFunction을 호출하면 innerFunction이 반환되고, 이를 closureFunction 변수에 할당한다.
  4. closureFunction()을 호출하면, outerFunction의 실행 컨텍스트는 이미 종료되었음에도 불구하고, innerFunctionouterVariable에 접근할 수 있다. 이는 innerFunction이 생성될 때의 렉시컬 환경(스코프)을 클로저로 기억하고 있기 때문이다.

클로저의 활용

  1. 데이터 은닉: 클로저를 사용하면 특정 데이터에 대한 접근을 제한할 수 있다. 이를 통해 외부에서 접근할 수 없는 프라이빗 변수를 만들 수 있다.
function createCounter() {
  let count = 0;
  return {
    increment: function() {
      count++;
      return count;
    },
    decrement: function() {
      count--;
      return count;
    }
  };
}

const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.decrement()); // 0
  1. 함수의 기억: 클로저는 특정 상탤르 "기억"하는 함수들을 만들 때 유용하다. 예를 들어, 이전 호출의 상태를 기억하는 함수가 필요할 때 클로저를 사용한다.
  2. 콜백 함수: 비동기 함수나 이벤트 핸들러에서 클로저는 유용하다. 클로저는 함수가 나중에 실행되더라도 그 당시으 스코프를 기억하여 변수에 접근할 수 있게 해준다.

클로저의 단점과 주의점

  • 메모리 사용 증가: 클로저는 함수와 함수가 생성된 환경을 참조하기 때문에, 불필요하게 많은 클로저가 생성되면 메모리 사용이 증가할 수 있다.
  • 디버깅 어려움: 클로저로 인해 발생하는 메모리 누수나 복잡한 스코프 체인은 디버깅을 어렵게 만들 수 있다.

0개의 댓글