위의 예제에서 count 변수는 Counter 함수의 지역 변수로 선언되었습니다. 이 변수는 increment, decrement, getCount 함수에서 사용되는데, 이 함수들은 Counter 함수에서 생성된 객체의 메서드로서 호출됩니다. 즉, count 변수는 Counter 함수에서 생성된 객체의 비공개 멤버가 됩니다.
이처럼 클로저를 이용하여 비공개 멤버를 만드는 방법은 객체 지향 프로그래밍에서 매우 유용하게 사용됩니다. 이를 통해 외부에서 직접 접근할 필요가 없는 내부 변수나 함수를 만들 수 있습니다.
다음으로, 클로저를 이용하여 콜백 함수를 만드는 방법에 대해 알아보겠습니다. 콜백 함수는 비동기식 프로그래밍에서 매우 중요한 역할을 합니다. 예를 들어, 다음과 같이 setTimeout 함수를 사용하여 1초 후에 메시지를 출력하는 함수를 만들어봅시다.
위의 예제에서 setTimeout 함수의 두 번째 인자로 showMessage 함수가 전달됩니다. 이때 showMessage 함수는 콜백 함수로 사용되며, setTimeout 함수가 지정한 시간이 경과한 후에 실행됩니다.
이번에는 클로저를 이용하여 콜백 함수를 만들어봅시다.
functionsayHelloLater(name) {
let message = `Hello, ${name}!`;
functionshowMessage() {
console.log(message);
}
return showMessage;
}
let hello = sayHelloLater("John");
setTimeout(hello, 1000);
위의 예제에서 sayHelloLater 함수는 message 변수를 생성하고, showMessage 함수를 내부에서 정의하여 반환합니다. 이때 showMessage 함수는 클로저를 이용하여 외부 함수의 변수인 message 변수에 접근할 수 있습니다.
이후 hello 변수에 sayHelloLater 함수가 반환한 showMessage 함수를 할당하고, setTimeout 함수에 hello 변수를 전달합니다. 이때 hello 변수는 클로저를 이용하여 sayHelloLater 함수의 message 변수에 접근하며, 1초 후에 "Hello, John!" 메시지가 출력됩니다.
setTimeout 함수에 대한 설명을 추가해보겠습니다. setTimeout 함수는 지정된 시간이 지난 후에 콜백 함수를 실행하는 함수입니다. 첫 번째 인자로 실행할 함수를 전달하고, 두 번째 인자로 시간을 전달합니다. 시간은 밀리초 단위로 전달되며, 이 예제에서는 1000밀리초, 즉 1초를 전달하였습니다.
그러면 이제 예시 코드를 실행해볼까요? 결과는 "Hello, John!" 메시지가 1초 후에 콘솔에 출력됩니다. 이때 hello 변수는 sayHelloLater 함수가 종료되더라도 message 변수에 접근할 수 있기 때문에, 클로저의 특징을 잘 나타내고 있습니다.
이와 같이 클로저는 비공개 멤버와 콜백 함수를 만드는데 매우 유용하게 사용됩니다. 클로저를 사용하면 내부 함수에서 외부 함수의 변수를 참조할 수 있기 때문에, 함수의 유효 범위를 효과적으로 제어할 수 있습니다.