클로저는 함수를 콜 할 때 마다 값이 초기화되는것을 방지하고 값을 살아있게 만드는 개념입니다.
클로저는 함수가 외부 함수의 변수에 접근할 수 있는 기능을 제공하며, 외부 함수가 실행을 끝낸 후에도 그 외부 변수들에 접근할 수 있는 기능을 유지합니다.
function aF(){
let myV = 1004;
function aaa(){
myV++;
document.write(myV);
}
return aaa; ///aaa함수를 리턴값으로
}
let hohoho = aF(); //af()를 호출했으니까 myV는 계속 살아있는거임
hohoho(); //aaa가 함수기때문에 호출가능 ---> 클로저함수
hohoho();
hohoho();
hohoho();
위 코드에서 aaa는 aF내부에 선언된 함수입니다. 중요한 점은 aF함수가 실행된 후에도, aaa함수가 여전히 myV에 접근할 수 있다는 것입니다. 이게 바로 클로저입니다.
aF가 실행된 후에도 hohoho가 호출되면, myV에 접근할 수 있습니다. 이는 aaa가 클로저를 형성하고, 외부 함수의 변수를 계속 기억하고 있기 때문입니다.
클로저의 특징
- 함수 안에서 다른 함수를 반환하면, 반환된 내부 함수는 외부 함수의 변수에 계속 접근할 수 있습니다.
- 외부 함수의 실행이 끝난 후에도 내부 함수는 외부 함수의 변수를 유지합니다.
- 외부 함수가 종료되었더라도, 내부 함수는 자신이 정의될 때의 환경을 기억합니다.
클로저의 예시
1. 데이터 보호 (캡슐화)
클로저를 사용하면 외부에서는 접근할 수 없는 비공개 변수를 만들 수 있습니다. 이를 통해 변수에 직접 접근하지 못하게 하고, 오직 내부 함수로만 그 값을 제어할 수 있게 합니다.
function createCounter() {
let count = 0; // 외부에서는 직접 접근할 수 없음
return function() {
count++; // 내부 함수에서만 count 접근 가능
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
count 변수는 createCounter 함수 내부에서 정의된 변수이므로 외부에서 직접 접근할 수 없습니다. 하지만 반환된 함수(클로저)를 통해 count 값을 변경하거나 읽을 수 있습니다.
2. 한 번 설정 후 계속 사용하는 설정 값 (Factory Pattern)
클로저를 사용하여 한 번 설정한 값을 계속 사용하는 패턴을 만들 수 있습니다.
function greeting(name) {
return function(message) {
console.log(`${name}: ${message}`);
};
}
const greetJohn = greeting('John');
greetJohn('Hello!'); // John: Hello!
greetJohn('How are you?'); // John: How are you?
const greetJane = greeting('Jane');
greetJane('Hi!'); // Jane: Hi!
위 코드에서 greeting('John')은 클로저를 형성하고, name이라는 외부 변수를 내부 함수가 계속 기억하게 됩니다. 이렇게 하면 특정 값을 고정시킨 후, 필요할 때마다 그 값을 사용해 함수 호출을 할 수 있습니다.
클로저의 장점
- 데이터 은닉: 변수를 클로저 안에 감추고, 외부에서 직접 접근할 수 없게 만듭니다. 오직 클로저를 통해서만 변수에 접근할 수 있어 보안이 강화됩니다.
- 상태 유지: 클로저는 외부 함수의 실행이 끝난 후에도 해당 함수의 상태를 유지할 수 있어, 특정 상황에서 상태를 저장하고 관리할 수 있습니다.
- 모듈화: 클로저를 사용하면 함수 내부에 캡슐화된 로직을 구현할 수 있어 코드의 모듈화를 도와줍니다.
클로저의 단점 및 주의점
- 메모리 사용: 클로저는 외부 함수의 변수를 계속 기억하고 있기 때문에, 클로저가 남용되면 불필요한 메모리를 차지할 수 있습니다. 특히 너무 많은 클로저를 사용하거나, 의도하지 않게 클로저가 메모리를 유지하면 메모리 누수가 발생할 수 있습니다.
- 디버깅 어려움: 클로저는 매우 유용하지만, 코드가 복잡해질수록 어떤 변수가 클로저 안에 저장되어 있는지 파악하기 어려울 수 있습니다. 특히 스코프 체인을 따라 변수를 추적해야 하기 때문에 디버깅이 까다로울 수 있습니다.
반응형
'JAVASCRIPT' 카테고리의 다른 글
JAVASCRIPT ) Spread 문법 (0) | 2024.07.26 |
---|---|
JAVASCRIPT ) Rest 파라미터 (0) | 2024.07.26 |
JAVASCRIPT ) 자료구조 (0) | 2024.07.24 |
JAVASCRIPT ) class (0) | 2024.07.22 |
JAVASCRIPT ) 템플릿 리터럴 (0) | 2024.07.19 |