자바스크립트는 매우 유연한 프로그래밍 언어로, 클로저(closure)라는 강력한 개념을 제공합니다. 클로저는 변수와 그 변수가 정의된 환경을 함께 기억하여 접근할 수 있게 해줍니다. 이로 인해 변수를 다른 함수의 외부에서도 사용할 수 있게 됩니다.
클로저의 개념
클로저는 내부 함수가 외부 함수의 변수에 접근할 수 있는 현상을 의미합니다. 내부 함수는 외부 함수의 스코프에 접근할 수 있지만, 그 반대는 성립하지 않습니다. 따라서, 외부 함수는 내부 함수의 접근을 통해 자신의 변수를 보호할 수 있습니다.
아래의 예제 코드를 통해 클로저의 개념을 이해해보겠습니다.
function outerFunction() {
let count = 0;
function innerFunction() {
count++;
console.log(count);
}
return innerFunction;
}
const closureFunc = outerFunction();
closureFunc(); // 1
closureFunc(); // 2
위의 코드에서 outerFunction
은 innerFunction
을 반환합니다. 이때, outerFunction
의 변수 count
는 innerFunction
에서 접근할 수 있습니다. closureFunc
는 innerFunction
의 참조를 가지고 있으며, 실행 시마다 count
를 증가시키고 출력합니다.
클로저의 활용
클로저는 다양한 상황에서 유용하게 활용될 수 있습니다. 여기서는 몇 가지 클로저의 활용 사례를 소개하겠습니다.
정보 은닉
클로저를 사용하면 변수를 외부로부터 은닉할 수 있습니다. 예를 들어, 아래의 코드에서 counter
변수는 외부에서 직접 접근할 수 없으며, 오직 increase
함수를 통해서만 값을 변경할 수 있습니다.
function counter() {
let count = 0;
function increase() {
count++;
console.log(count);
}
return increase;
}
const myCounter = counter();
myCounter(); // 1
myCounter(); // 2
비동기 작업 처리
클로저는 비동기 작업을 간편하게 처리할 수 있도록 돕습니다. 아래의 예제에서는 setTimeout
함수를 사용하여 비동기적으로 메시지를 출력하는 createDelayedMessage
함수를 만들었습니다.
function createDelayedMessage(message, delay) {
return function() {
setTimeout(function() {
console.log(message);
}, delay);
};
}
const delayedHello = createDelayedMessage('Hello, world!', 1000);
delayedHello(); // 1초 후에 'Hello, world!' 출력
클로저를 사용하여 setTimeout
함수 내에서 message
값을 유지하고, 원하는 시간만큼 딜레이 후에 메시지를 출력할 수 있습니다.
마무리
클로저는 자바스크립트에서 강력한 기능으로, 변수의 보호와 비동기 작업 처리 등 다양한 상황에서 유용하게 활용될 수 있습니다. 클로저를 효과적으로 사용하여 코드를 작성하면 더욱 유지 보수가 쉽고 강력한 프로그램을 구현할 수 있습니다.