Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 큐
- 4기
- CSS
- 모션비트
- 티스토리챌린지
- Flutter
- 오블완
- 백준
- Vue.js
- HTML
- corou
- TiL
- 사이드프로젝트
- 코드트리
- 나만무
- 스택
- pintos
- 자바
- JavaScript
- 크래프톤정글
- 크래프톤 정글
- userprog
- 자바스크립트
- Java
- 시스템콜
- defee
- 소켓
- 핀토스
- 리액트
- 알고리즘
Archives
- Today
- Total
미새문지
클로저(Closure) 본문
728x90
클로저(Closure)
클로저는 자바스크립트에서 함수가 선언될 때의 스코프를 기억하여, 함수가 생성된 이후에도 그 스코프에 접근할 수 있는 기능이다.
주로, 함수 내부에서 선언된 다른 함수가 외부 함수의 변수에 접근할 수 있게 해주는 메커니즘을 의미하며, 클로저는 자바스크립트의 함수가 일급 객체라는 특성과 렉시컬 스코프의 조합으로 만들어진다.
클로저의 형성 과정
- 함수 내부의 함수
- 클로저는 일반적으로 함수 내부에 선언된 함수가 반환되거나 다른 곳에서 호출될 때 형성된다.
- 외부 변수 접근
- 내부 함수는 자신이 선언된 스코프에 있는 변수들에 접근할 수 있다.
- 생존 기간 연장
- 외부 함수가 실행을 종료하더라도, 내부 함수가 외부 함수의 변수들을 참조하고 있다면, 해당 변수들은 메모리에서 지워지지 않고 유지된다.
예시 코드
function outerFunction(outerVariable) {
return function innerFunction(innerVariable) {
console.log(`Outer Variable: ${outerVariable}`);
console.log(`Inner Variable: ${innerVariable}`);
};
}
const newFunction = outerFunction('outside'); // outerFunction 호출, 클로저 생성
newFunction('inside');
// 결과:
// Outer Variable: outside
// Inner Variable: inside
- outerFunction이 호출되면 outerVariable은 "outside"로 초기화된다.
- innerFunction은 outerFunction 내부에 정의되었으므로 outerVariable에 접근할 수 있다.
- newFunction은 innerFunction을 참조하므로, 외부 함수가 종료된 후에도 outerVariable이 메모리에 유지된다.
활용 사례
상태 유지
클로저는 변수와 함수의 접근 범위를 제어하고 특정 데이터와 상태를 유지하기 위해 자주 활용된다.
function createCounter() {
let count = 0; // 상태 유지
return function () {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
데이터 은닉
클로저를 사용해 외부에서 접근 불가능한 private 변수를 구현할 수 있다.
function secret() {
let privateData = "This is private";
return {
getSecret: function () {
return privateData;
},
setSecret: function (newSecret) {
privateData = newSecret;
}
};
}
const mySecret = secret();
console.log(mySecret.getSecret()); // This is private
mySecret.setSecret("New secret");
console.log(mySecret.getSecret()); // New secret
이벤트 핸들러
이벤트 핸들러에서 자주 사용된다.
function attachHandlers() {
const buttons = document.querySelectorAll('button');
for (let i = 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', function () {
console.log(`Button ${i} clicked`);
});
}
}
attachHandlers();
클로저의 특징
- 캡슐화: 외부에서 접근할 수 없는 변수를 은닉할 수 있다.
- 메모리 관리: 클로저가 참조하는 변수는 내부 함수가 더 이상 사용되지 않을 때 가비지 컬렉션에 의해 해제된다.
- 성능 이슈: 클로저가 너무 많거나 불필요하게 생성되면 메모리 누수를 유발할 수 있다.
728x90
'개발 TIL' 카테고리의 다른 글
실행 컨텍스트(Execution Context) (0) | 2025.01.08 |
---|---|
Reflow와 Repaint (0) | 2025.01.08 |
SOLID 원칙 (0) | 2025.01.06 |
Typescript란? (0) | 2025.01.03 |
defee headline api 연동 테스트 및 잡담 (0) | 2025.01.02 |