본문 바로가기

JAVASCRIPT

JAVASCRIPT ) 클로저 Closure

클로저는 함수를 콜 할 때 마다 값이 초기화되는것을 방지하고 값을 살아있게 만드는 개념입니다.

클로저는 함수가 외부 함수의 변수에 접근할 수 있는 기능을 제공하며, 외부 함수가 실행을 끝낸 후에도 그 외부 변수들에 접근할 수 있는 기능을 유지합니다.

 

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이라는 외부 변수를 내부 함수가 계속 기억하게 됩니다. 이렇게 하면 특정 값을 고정시킨 후, 필요할 때마다 그 값을 사용해 함수 호출을 할 수 있습니다.

 

 

클로저의 장점

  1. 데이터 은닉: 변수를 클로저 안에 감추고, 외부에서 직접 접근할 수 없게 만듭니다. 오직 클로저를 통해서만 변수에 접근할 수 있어 보안이 강화됩니다.
  2. 상태 유지: 클로저는 외부 함수의 실행이 끝난 후에도 해당 함수의 상태를 유지할 수 있어, 특정 상황에서 상태를 저장하고 관리할 수 있습니다.
  3. 모듈화: 클로저를 사용하면 함수 내부에 캡슐화된 로직을 구현할 수 있어 코드의 모듈화를 도와줍니다.

 

클로저의 단점 및 주의점

  1. 메모리 사용: 클로저는 외부 함수의 변수를 계속 기억하고 있기 때문에, 클로저가 남용되면 불필요한 메모리를 차지할 수 있습니다. 특히 너무 많은 클로저를 사용하거나, 의도하지 않게 클로저가 메모리를 유지하면 메모리 누수가 발생할 수 있습니다.
  2. 디버깅 어려움: 클로저는 매우 유용하지만, 코드가 복잡해질수록 어떤 변수가 클로저 안에 저장되어 있는지 파악하기 어려울 수 있습니다. 특히 스코프 체인을 따라 변수를 추적해야 하기 때문에 디버깅이 까다로울 수 있습니다.
반응형

'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