728x90
반응형
728x90
클로저(Closure)
클로저(Closure)는 자바스크립트에서 자주 등장하지만, 처음 접하면 다소 추상적으로 느껴지는 개념입니다. 하지만 클로저를 이해하면 상태를 은닉하거나, 콜백 함수 내 변수 유지, 팩토리 함수 생성 등 다양한 실무 패턴을 더 깊이 있게 이해할 수 있습니다.
1. 클로저란?
클로저란, 함수가 선언될 당시의 렉시컬 환경을 기억하는 함수입니다. 즉, 외부 함수의 변수에 접근할 수 있는 내부 함수를 말합니다. 함수가 이미 실행을 끝냈더라도, 그 내부 함수는 여전히 외부 변수에 접근할 수 있습니다.
function outer() {
const name = 'JavaScript';
function inner() {
console.log(`Hello, ${name}`);
}
return inner;
}
const fn = outer(); // outer() 실행 → inner 함수 반환
fn(); // Hello, JavaScript
어떻게 가능한가요?
- outer() 함수는 실행이 끝났지만, inner() 함수가 name에 접근 가능합니다.
→ 이게 바로 클로저입니다.
2. 클로저를 사용하는 이유
a. 데이터 은닉 (Private 변수)
function counter() {
let count = 0;
return {
increase() {
count++;
console.log(count);
},
decrease() {
count--;
console.log(count);
}
};
}
const c = counter();
c.increase(); // 1
c.increase(); // 2
c.decrease(); // 1
- count는 외부에서 접근할 수 없습니다. (은닉됨)
- 오직 increase, decrease만 접근 가능합니다.
→ 정보 은닉 + 상태 유지 = 클로저
b. 콜백 함수에서의 상태 유지
function makeTimer(message) {
return function () {
console.log(message);
};
}
const helloTimer = makeTimer('Hello!');
setTimeout(helloTimer, 1000);
- message는 외부 함수가 끝났어도 setTimeout 내에서 유지됩니다.
3. 실수하기 쉬운 예제
반복문 안의 클로저
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i); // 3, 3, 3
}, 100);
}
- var는 함수 스코프라서 모두 같은 i를 참조합니다.
해결 방법 1 : let 사용
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i); // 0, 1, 2
}, 100);
}
해결 방법 2 : 클로저 사용
for (var i = 0; i < 3; i++) {
(function(j) {
setTimeout(() => {
console.log(j); // 0, 1, 2
}, 100);
})(i);
}
4. 클로저는 언제 만들어지나요?
- 함수가 다른 함수 내부에서 정의될 때
- 내부 함수가 외부 변수에 접근할 때
- 내부 함수가 외부 함수 밖으로 반환되거나, 콜백으로 전달될 때
5. 클로저의 장점과 주의점
장점
- 상태 유지가 가능합니다.
- 정보 은닉을 할 수 있습니다.
- 모듈화에 유리합니다.
주의점
- 과도한 메모리 점유가 될 수 있습니다. (GC가 외부 변수 정리 못 함)
- 디버깅이 어려울 수 있습니다.
6. 마무리
클로저는 JavaScript의 함수형 특성과 스코프 체인의 결합으로 만들어지는 고급 기능입니다. 익숙해지면 모듈, 커링, 고차 함수, 콜백, 리액트 훅 등 다양한 패턴을 쉽게 이해하고 구현할 수 있습니다.
반응형
728x90
반응형
'언어 > JavaScript' 카테고리의 다른 글
[var, let, const] 자바스크립트 변수 선언의 차이점과 쓰임새 (0) | 2025.04.13 |
---|---|
[버블링과 캡처링] 자바스크립트의 이벤트가 흐르는 길 (0) | 2025.04.12 |
[이벤트 리스너] 사용자와 코드 사이를 잇는 연결고리 (0) | 2025.04.12 |
[콜백 함수] 자바스크립트 함수의 함수스러운 사용법 (0) | 2025.04.12 |
[async와 await] 비동기 코드를 동기처럼 쓰는 방법 (0) | 2025.04.12 |