본문 바로가기
📌 Front End/└ JavaScript

[JavaScript] 자바스크립트 클로저(Closure)란?

by 쫄리_ 2023. 3. 10.
728x90
반응형

클로저의 의미

클로저는 여러 함수형 프로그래밍 언어에서 등장하는 보편적인 특성입니다. 자바스크립트 고유의 개념이 아니라서 ECMAScript 명세에서도 클로저의 정의를 다루지 있습니다. 더구나 클로저를 설명하는 문장 자체도 이해하기 어려운 경우가 많습니다.

클로저는 실행 컨텍스트의 스코프 체인과 깊은 관련이 있습니다.
어떤 컨텍스트 A에서 선언한 내부함수 B의 실행 컨텍스트가 활성화된 시점에는 B의 outerEnvironmentReference가 참조하는 대상인 A의 LexicalEnvironment에도 접근이 가능하겠죠. A에서는 B에서 선언한 변수에 접근할 수 없지만 B에서는 A에서 선언한 변수에 접근 가능합니다. 이 부분이 바로 클로저를 관통하는 개념입니다.


클로저의 원리

inner 함수의 실행 시점에서 outer 함수는 이미 실행이 종료된 상태여도 outer 함수의 LexicalEnvironment에 접근이 가능합니다. 이는 가비지 컬렉터의 동작 방식 때문입니다. 가비지 컬렉터는 어떤 값을 참조하는 변수가 하나라도 있다면 그 값은 수집 대상에 포함시키지 않습니다.
외부함수인 outer의 실행이 종료되더라도 내부 함수인 inner 함수는 언젠가 outer를 실행함으로써 호출될 가능성이 열린 것입니다. 언젠가 inner 함수의 실행 컨텍스트가 활성화되면 outerEnvironmentReference가 outer 함수의 LexicalEnvironment를 필요로 할 것이므로 수집 대상에서 제외됩니다.
이러한 원리로 어떤 함수 A에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상이 발생합니다.


클로저의 메모리 관리

'메모리 누수'는 개발자의 의도와 달리 어떤 값의 참조 카운트가 0이 되지 않아 GC의 수거 대상이 되지 않는 경우입니다. 그렇다면 그 필요성이 사라진 시점에는 더는 메모리를 소모하지 않게 해주면 됩니다.

클로저는 어떤 필요에 의해 의도적으로 함수의 지역변수를 메모리를 소모하도록 합니다. 따라서 클로저의 사용이 종료되 된 이후에는 참조 카운터를 0으로 만들어야 GC의 수거대상이 되서 메모리 누수가 발생하지 않습니다.
식별자에 참조형이 아닌 null이나 nudefined를 할당하면 됩니다.


클로저의 활용

정보 은닉

정보 은닉은 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 현대 프로그래밍 언어의 중요한 개념 중 하나입니다.
외부에 제공하고자 하는 정보들을 모아서 return하고, 내부에서만 사용할 정보들은 return하지 않는 것으로 접근 권한 제어가 가능한 것입니다. return한 변수들은 공개 멤보가 되고, 그렇지 않은 변수들은 비공개 멤버가 됩니다.

디바운스

디바운스는 짧은 시간 동안 동일한 이벤트가 많이 발생할 경우 이를 전부 처리하지 않고 처음 또는 마지막에 발생한 이벤트에 대해 한 번만 처리하는 것입니다.

커링 함수

커링 함수란 여러개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인 형태로 구성한 것을 말합니다.
가 단계에서 받은 인자들을 모두 마지막 단계까지 참조할 것이므로 GC 되지 않고 메모리에 차고차곡 쌓였다고, 마지막 호출로 실행 컨텍스트가 종료된 후에야 비로소 한꺼번에 GC의 수거 대상이 됩니다.

728x90
반응형