본문 바로가기

개발자 페이지/Javascript

05 클로저 by 코어 자바스크립트

728x90
반응형

아래 내용은 '코어 자바스크립트' 정재남 저 | 위키북스의 내용을 발췌한 것으로

 자세한 내용은 해당 서적을 확인 바랍니다. 

 

클로저의 의미 및 원리

클로저(closure)는 여러 함수형 프로그래밍 언어에서 등장하는 보편적인 특성으로, JS 고유 개념이 아니라 ECMA Script 에서도 클로저의 정의를 다루지 않고 있다. 

 

MDN(Mozilla Developer Network) 
"A closure is the combination of a function and the lexical environment within which that function was declared" 

가비지 컬렉터 GC 는 어떤 값을 참조하는 변수가 하나라도 있다면 그 값은 수집대상에 포함시키지 않는다.

 

클로저란 어떤 함수 A에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상을 말한다.

 

이외에도 다르게 표현하자면

  • 함수를 선언할 때 만들어지는 유효범위가 사라진 후에도 호출할 수 있는 함수
  • 이미 생명 주기가 끝난 외부 함수의 변수를 참조하는 함수
  • 자신이 생성될 때의 스코프에서 알 수 있었던 변수들 중 언젠가 자신이 실행될 때 사용할 변수들만을 기억하여 유지시키는 함수

 

클로저는 메모리 누수를 일으키는 문제가 있다고 하나, 메모리 소모에 대한 관리법을 잘 파악해서 적용하면 유용하게 사용할 수 있게 된다. 관리 방법은 간단한데, 클로저는 어떤 필요에 의해 의도적으로 함수의 지역변수 메모리를 소모하도록 함으로써 발생한다. 그렇다면 필요성이 사라진 시점에는 더는 메모리를 소모하지 않게 해주면 된다. 참조 카운트를 0으로 만들면 언젠가 GC가 수거해갈 것이고, 이때 소모됐던 메모리가 회수될 것이다.

참조 카운트를 0으로 만드는 방법으로는 식별자에 참조형이 아닌 기본형 데이터(보통null, undefined)를 할당하면 된다.

 

접근 권한 제어(정보 은닉)

정보은닉(information hiding)은 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 현대 프로그래밍 언어의 중요한 개념중 하나이다. 

 

접근 권한에는 public, private, protected의 세 종류가 있다.

 

자바스크립트는 기본적으로 변수 자체에 이러한 접근 권한을 직접 부여하도록 설계돼 있지 않으나, 클로저를 이용하면 함수 차원에서 public, private값을 구분하는 것이 가능하다.

 

const outer = function(){
	var a = 1;
    var inner = function(){
    	return ++a;
    };
    return inner;
};
const outer2 = outer();
console.log(outer2());
console.log(outer2());

outer 함수는 외부(전역 스코프)로부터 철저하게 격리된 닫힌 공간이다. 외부에서는 외부 공간에 노출돼 있는 outer라는 변수를 통해 outer 함수를 실행할 수는 있지만, outer 함수 내부에는 어떠한 개입도 할 수 없다. 외부에서는 오직 outer 함수가 return한 정보에만 접근할 수 있으므로, return 값이 외부에 정보를 제공하는 유일한 수단인 것이다.

 

즉, 외부에 제공하고자 하는 정보들을 모아서 return하고, 내부에서만 사용할 정보들은 return하지 않는 것으로 접근 권한 제어가 가능한 것이다. return한 변수들은 공개 멤버가 되고, 그렇지 않은 변수들은 비공개 멤버가 되는 것이다.

728x90