til - JavaScript

2025-03-21 TIL-클로저(Closure)

클로저란?

클로저(Closure)는 함수가 자기 자신이 선언된 환경(scope) 외부에서도 그 환경의 변수를 접근할 수 있게 해주는 특성을 말한다. 쉽게 말해, 함수가 자기 자신이 생성될 당시의 변수를 기억하고 참조할 수 있는 기능이다.

클로저의 특징

  1. 내부 함수가 외부 함수의 변수에 접근 가능

    • 클로저는 내부 함수가 외부 함수의 변수에 접근할 수 있게 한다. 이는 외부 함수가 실행된 후에도 그 변수들이 계속해서 유효함을 의미한다.
  2. 외부 함수의 실행이 끝나도 변수에 접근 가능

    • 외부 함수가 실행을 마치고 스코프가 종료되더라도, 클로저가 참조하는 변수는 메모리에서 사라지지 않고 계속해서 유지된다.

클로저 예시 코드

function outer() {
  let outerVariable = "I am outer";

  function inner() {
    console.log(outerVariable); // inner 함수에서 outerVariable을 사용
  }

  return inner;
}

const closureFunction = outer();
closureFunction(); // 'I am outer' 출력

위 예시에서 inner 함수는 outer 함수 내부에 있지만, outer 함수가 끝나도 inner 함수는 outerVariable에 접근할 수 있다. 이는 inner 함수가 클로저를 형성하기 때문이다.

클로저 활용

클로저는 변수와 함수의 접근 범위를 제어하고 특정 데이터와 상태를 유지하기 위해 자주 활용된다. 크게 세 가지 대표적인 사용 사례로 나누어 설명할 수 있다.

  1. 데이터 은닉에 활용

    • 클로저는 외부에서 접근할 수 없는 비공개 변수와 함수를 만들 수 있다. 이를 통해 데이터를 은닉하여 외부 접근을 막고, 데이터 무결성을 유지할 수 있다. 예를 들어, 특정 함수 내부에서만 접근 가능한 변수를 생성하고, 이를 조작할 수 있는 함수만 외부로 노출하여 안전하게 데이터를 관리할 수 있다.
  2. 비동기 작업에 활용

    • 클로저는 비동기 작업에서 이전의 실행 컨텍스트를 유지해야 할 때 유용하다. 콜백 함수가 비동기적으로 실행될 때 클로저를 사용하면 함수 실행 시점의 변수를 참조할 수 있다.
  3. 모듈 패턴을 구현하는 데 활용

    • 모듈 패턴은 특정 기능을 캡슐화하고, 외부에 공개하고자 하는 부분만 선택적으로 노출하여 코드의 응집력을 높이고, 유지보수성을 향상시키는 패턴이다. 클로저를 활용하면 필요한 함수와 데이터만 외부로 노출함으로써 모듈 패턴을 쉽게 구현할 수 있다.
function createLogger(name) {
  return function () {
    console.log(`Logger: ${name}`);
  };
}

const logger = createLogger("MyApp");
setTimeout(logger, 1000); // 1초 후에 'Logger: MyApp' 출력

위의 예시에서 클로저가 name 변수 ('MyApp')를 저장하여 1초 후에도 해당 값이 유지되어 출력된다.

클로저의 단점

  1. 메모리 누수

    • 클로저가 외부 함수의 변수를 참조하고 있기 때문에, 외부 함수의 변수들이 메모리에서 해제되지 않고 계속 유지될 수 있다. 이로 인해 불필요한 메모리 사용이 발생할 수 있다.
  2. 디버깅 어려움

    • 클로저가 잘못 사용될 경우 코드가 복잡해지고, 디버깅이 어려워질 수 있다.

카테고리:

업데이트: