
JavaScript 클로저(Closure) 완벽 이해
JavaScript에서 클로저(Closure)는 중요한 개념 중 하나입니다. 클로저는 함수와 그 함수가 선언된 렉시컬 환경이 결합된 객체입니다. 이는 함수가 선언된 시점에서의 변수를 기억하고, 그 변수를 나중에 참조할 수 있도록 만들어 줍니다.
클로저란?
클로저는 함수와 그 함수가 선언된 환경(변수)에 대한 참조를 함께 가진 함수입니다. 이는 함수 내에서 선언된 변수에 접근할 수 있도록 해 줍니다.
클로저 예시
function outer() {
let counter = 0; // outer 함수의 지역 변수
return function inner() {
counter++;
console.log(counter); // inner 함수는 outer 함수의 지역 변수에 접근 가능
};
}
const closure = outer(); // outer 함수 실행
closure(); // 1
closure(); // 2
closure(); // 3
위 예제에서 inner() 함수는 outer() 함수의 counter 변수에 접근할 수 있습니다. 이처럼 클로저는 내부 함수가 외부 함수의 변수에 접근할 수 있게 합니다.
클로저 활용 예시
function makeCounter() {
let count = 0;
return {
increment: function() {
count++;
return count;
},
decrement: function() {
count--;
return count;
}
};
}
const counter = makeCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.decrement()); // 1
makeCounter 함수는 클로저를 이용해 카운터 값을 기억하고 있으며, 외부에서는 increment와 decrement 메서드를 통해 카운트를 변경할 수 있습니다.
클로저의 장점
- 상태를 유지하는 함수 만들기
- 정보 은닉(Encapsulation) 가능
- 콜백 함수에서 상태를 기억할 수 있음
클로저의 단점
- 메모리 누수 가능성
- 과도한 사용 시 코드 복잡도 증가
클로저와 관련된 중요한 개념
- 렉시컬 스코프(Lexical Scope): 변수의 스코프를 함수가 정의된 위치에 따라 결정하는 규칙
- 함수형 프로그래밍(Function Programming): 함수가 1급 객체로 취급되며, 클로저와 밀접하게 연결됨