본문 바로가기
TECH

클로저 (Closure) ⛱

by Stella-Park 2025. 7. 9.
728x90

 


클로저는 함수가 선언될 당시의 스코프를 기억하여, 함수가 호출되는 시점에 그 스코프에 접근할 수 있게 해주는 강력한 기능

 

함수와 그 함수가 선언될 당시의 렉시컬 환경(Lexical Environment)을 함께 기억하는 기능이다.

자바스크립트에서 함수는 변수에 할당될 수 있고 다른 함수의 인자로 전달되거나 반환될 수 있다.

이때 함수가 자신이 선언될 때의 스코프(변수, 상수 등)를 기억하고 있어서 함수가 선언된 스코프 밖에서 실행되더라도 그 스코프의 변수에 접근이 가능한데 이 현상을 클로저라고 한다.

 

렉시컬 환경(Lexical Environment)에 대한 추가 설명은 아래 참고!

 

 

왜 클로저를 사용하는가?

  • 데이터 은닉 및 캡슐화
  • 상태 유지
  • 콜백, 이벤트 리스너, 타이머 등에서 유용
  • 모듈 패턴 구현 가능

 

예제

function outer() {
  let count = 0;  // outer 함수의 지역 변수

  function inner() {
    count++;
    console.log(`현재 count: ${count}`);
  }

  return inner;
}

const closureFunc = outer();  // outer가 실행되며 inner를 반환
closureFunc(); // 현재 count: 1
closureFunc(); // 현재 count: 2
closureFunc(); // 현재 count: 3
  • outer() 함수는 inner()를 반환한다.
  • closureFunc는 inner()를 가리키지만, outer()의 count에 계속 접근할 수 있다.
  • outer()는 이미 실행을 마쳤지만, 반환된 inner()가 count를 기억하고 있기 때문에 count 값이 유지된다.

 

데이터 은닉 에제

function createCounter() {
  let count = 0;

  return {
    increment: function() {
      count++;
      console.log(count);
    },

    decrement: function() {
      count--;
      console.log(count);
    },

    getCount: function() {
      return count;
    }
  };
}

const counter = createCounter();
counter.increment();  // 1
counter.increment();  // 2
counter.decrement();  // 1
console.log(counter.getCount());  // 1
  • count 변수는 외부에서 직접 접근할 수 없다.
  • 오직 increment, decrement, getCount 메서드를 통해서만 조작이 가능하다.
  • 클로저를 통해 count 변수가 은닉(캡슐화)된다.

 

클로저 사용 시 주의할 점

  • 클로저는 메모리를 계속 차지하기 때문에 불필요한 클로저는 메모리 누수를 초래할 수 있다.
  • 이벤트 핸들러 등에서는 클로저 내부 변수가 과도하게 유지되지 않도록 관리해야 한다.

 

es6 + 클로저 예제 (고차 함수와 클로저)

const makeAdder = (x) => (y) => x + y;

const add5 = makeAdder(5);
console.log(add5(10));  // 15
console.log(add5(3));   // 8

 

 

 

렉시컬 환경이란?

렉시컬(Lexical)이라는 단어는 코드가 작성된 위치(문맥)를 의미하는데

렉시컬 환경은 코드가 작성될 때(=컴파일 타임에) 결정되는 변수와 함수의 유효 범위(스코프)를 포함하는 구조적 환경을 말한다.

쉽게 말하면 렉시컬 환경은 코드가 작성된 위치에 따라 변수, 상수, 함수 선언을 기억하고 관리하는 내부적인 자료구조” 

 

 

렉시컬 환경의 특징

  • 코드가 작성될 때 결정된다. (즉, 실행 시점이 아니라 코드의 위치에 따라 스코프가 결정됨)
  • 함수가 생성될 때 그 함수의 렉시컬 환경도 함께 생성된다.
  •  클로저는 렉시컬 환경을 함수와 함께 기억한다.

면접에서도 물어보는 중요한 개념 중 하나다. 이번 기회에 지식 하나 더 늘었다 ‼️

 

 

이상 스텔라였습니다. ✍️

 

 

 

 

 

 

728x90

'TECH' 카테고리의 다른 글

개발하면서... 느끼는 부분 정리 👩🏻‍💻  (5) 2025.07.17
this 👆🏻  (6) 2025.07.11
css 인라인 조건문 🅸🅵  (1) 2025.07.08
접근성과 인클루시브 디자인 👩🏻‍🎨  (2) 2025.07.07
이벤트 전파 🖐🏻  (4) 2025.07.04