Skip to content
포스트
JavaScript
쉽게 이해하는 자바스크립트 클로저(Closure)

쉽게 이해하는 자바스크립트 클로저(Closure)

클로저는 자바스크립트에서 매우 중요한 개념 중 하나입니다. 이를 이해하면 코드를 더 효율적으로 작성할 수 있고, 복잡한 문제를 해결하는 데 도움이 됩니다. 이번 글에서는 클로저에 대해 깊이 있게 다루어보겠습니다.

클로저란 무엇인가요?

클로저는 함수와 함수가 선언될 당시의 환경(Lexical Environment)과의 조합입니다. 이는 함수가 다른 함수의 내부에 중첩될 때 발생합니다. 내부 함수는 외부 함수의 변수에 접근할 수 있는데, 이것이 바로 클로저입니다.

간단한 예제를 통해 클로저를 살펴보겠습니다.

function outerFunction() {
  let outerVariable = 'I am outer!';
 
  function innerFunction() {
    console.log(outerVariable);
  }
 
  return innerFunction;
}
 
const myClosure = outerFunction();
myClosure(); // 출력: I am outer!

위 코드에서 innerFunction은 outerFunction의 내부에서 정의되었습니다. 하지만 myClosure를 호출할 때 outerVariable에 접근할 수 있습니다. 이것이 클로저의 동작 원리입니다.

클로저의 활용

1. Private 변수 구현

클로저를 사용하면 변수를 외부에서 접근할 수 없도록 숨길 수 있습니다. 이는 객체 지향 프로그래밍에서의 private 변수와 유사한 개념입니다.

function counter() {
  let count = 0;
 
  return function() {
    count++;
    console.log(count);
  }
}
 
const increment = counter();
increment(); // 출력: 1
increment(); // 출력: 2

2. 상태 유지(State Preservation)

클로저를 사용하면 함수가 종료되더라도 해당 함수의 변수가 메모리에 유지됩니다. 이를 통해 함수의 내부 상태를 유지할 수 있습니다.

function createCounter() {
  let count = 0;
 
  return {
    increment: function() {
      count++;
    },
    getCount: function() {
      return count;
    }
  };
}
 
const counter = createCounter();
counter.increment();
console.log(counter.getCount()); // 출력: 1

3. 함수 팩토리(Function Factory)

클로저를 활용하여 매번 새로운 함수를 생성하는 함수 팩토리를 만들 수 있습니다.

function greeter(name) {
  return function() {
    console.log(`Hello, ${name}!`);
  };
}
 
const greetJohn = greeter('John');
greetJohn(); // 출력: Hello, John!

[!CAUTION] 클로저를 사용할 때 주의해야 할 몇 가지 사항이 있습니다.

  • 메모리 누수(Memory Leak): 클로저를 잘못 사용하면 메모리 누수가 발생할 수 있습니다. 필요 이상으로 변수를 계속 유지하면 메모리가 부족해질 수 있습니다.

  • 성능 저하: 클로저를 과도하게 사용하면 성능이 저하될 수 있습니다. 클로저는 외부 변수에 접근할 때마다 스코프 체인을 거쳐야 하므로 이는 성능에 영향을 줄 수 있습니다.

마무리

클로저는 자바스크립트에서 강력한 도구 중 하나입니다. 이를 올바르게 활용하면 코드를 더 깔끔하고 유연하게 작성할 수 있습니다. 하지만 너무 남발하지 않고 적절히 사용해야 합니다. 클로저에 대한 개념을 잘 이해하고, 실제로 활용해보면 코드 작성에 많은 도움이 될 것입니다. 함께 클로저를 마스터하여 자바스크립트의 능력을 극대화해봅시다!