클로저(Closure)는 프로그래밍에서 변수의 수명(scope)과 함수의 관계를 이해하는 데 중요한 개념이다. 클로저는 함수와 그 함수가 선언된 환경(변수의 스코프)을 함께 묶은 구조로, 주로 함수형 프로그래밍 언어에서 활용된다.
클로저는 특정 함수가 생성될 때 그 함수가 참조하는 외부 변수에 대한 접근을 유지하도록 해준다. 즉, 클로저는 내부 함수가 외부 함수의 변수에 접근할 수 있는 능력을 제공하며, 이는 해당 외부 함수의 실행이 종료된 이후에도 그 외부 변수의 값을 사용할 수 있게 한다.
예를 들어, 자바스크립트에서 클로저는 다음과 같은 방식으로 생성된다:
```javascript
function outerFunction() {
let outerVariable = 'I am from outer scope';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
const closureFunction = outerFunction();
closureFunction(); // 'I am from outer scope'가 출력됨
```
위의 예에서 `outerFunction`은 `innerFunction`을 반환하고, `innerFunction`은 `outerVariable`에 접근할 수 있다. 이때 `outerFunction`이 종료되더라도, `closureFunction`은 여전히 `outerVariable`에 접근할 수 있다.
클로저는 데이터 비공식화(data encapsulation)와 같은 여러 디자인 패턴에서 중요한 역할을 하며, 비동기 프로그래밍, 이벤트 핸들링 등에서도 널리 사용된다. 클로저를 적절히 활용하면 코드의 재사용성, 모듈화 및 유지보수성을 높일 수 있다. 그러나 클로저는 외부 변수를 계속 유지하기 때문에 메모리 관리에 주의해야 한다. 클로저를 많이 사용할 경우 메모리 누수(memory leak)가 발생할 수 있다.