상세 컨텐츠

본문 제목

함수형 프로그래밍 - 클로저

이론공부

by 비오스터딩 2020. 12. 14. 23:48

본문

일급객체 (first-class object)

자바스크립트에서 함수는 일급객체이다. 일급 객체란 생성, 대입, 연산, 인자 또는 반환값으로서의 전달 등 프로그래밍 언어의 기본적 조작을 제한없이 사용할 수 있는 대상을 의미한다.

함수도 객체이므로 값으로 사용할 수 있다. 즉 변수나 객체, 배열 등에 저장 할 수 있으며, 함수의 매개변수(parameter)나 반환값으로도 사용된다.

 

 

클로저 (closure)

클로저는 자바스크립트 고유의 개념이 아니라 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어에서 사용되는 중요한 특성이다. 클로저함수란 렉시컬 환경을 기억하는 함수이다.

 

** 렉시컬 스코프 :  스코프(변수가 유효한 범위)는 함수를 어디에 선언하였는지에 따라 결정된다(렉시컬 스코핑).

이에 따라 결정되는 스코프를 렉시컬스코프라 부른다. 함수는 렉시컬스코프를 참조한다.

** 스코프 체인 : 변수를 찾을 때, 자신의 스코프에서 변수를 찾고, 변수가 없으면 외부함수에서 변수를 찾는다.

내부함수에서는 외부함수에 접근할 수 있지만, 외부함수에서는 내부함수에 접근할 수 없다.

 

 

다음 예시를 통해 무슨 말인지 구체적으로 살펴보자.

innerFnc에서 x가 선언되지 않았다. 하지만 innerFnc은 outerFnc에 있는 변수 x에 접근 할 수 있다. (outerFnc의 외부함수라면 x에 접근할 수 없다.) 단순하게 말해서 여기서 innerFnc의 렉시컬 스코프는 outerFnc라고도 할 수 있다. (outerFnc의 스코프에 있는 x에 접근하므로).

 

그럼 다음의 코드를 살펴보자.

const inner = outerFnc (); // outerFnc 호출. 그 결과로 innerFunc이 변수 inner에 담긴다. 즉 outterFnc은 innerFunc을 반환하고 실행컨텍스트에서 사라진다. (innerFunc은 아직 호출되지 않음)

inner();  // innerFunc 호출. outerFnc 함수는 실행이 끝났으므로 지역변수(x)는 소멸되어야한다. 그러나 코드 실행 결과는 10이다. 여기서 클로저함수의 특징을 볼 수 있다. 

클로저란 렉시컬 스코프를 기억하는 함수다. 즉 클로저 함수는 렉시컬스코프(outerFnc)의 환경을 기억하고 있다. 내부함수(클로저함수)가 소멸 될때까지, 렉시컬스코프는 소멸되지 않는다.

 

 

클로저 함수의 사용

다음과 같은 클로저 함수를 살펴보자.

여기서 counter는 외부에서 직접 접근할 수 없고(이미 사라졌으므로 외부에서 접근하려고 하면 참조에러가 발생한다), increaser을 사용해서만 접근할 수 있는 private 변수이다. 이는 의도되지 않은 변경을 걱정할 필요가 없기 때문에 프로그램의 안정성을 높일 수 있다. (react에서 사용하는 state도 이와같은 형태이다.)

 

다른 방법으로도 하나 더 만들어 봤다. count 함수 내에서 사용된 변수 counter는 private 변수이므로 외부에서 직접 변경할 수 없다. counter = count(0) 에서 사용된 변수 counter은 내부함수랑 상관없어서 그냥 같은 변수명으로 사용해봤다. 어쨌든 count(0)으로 첫번째 값을 0으로 지정해주었고, 그 후 메서드를 불러와 더하고 빼기를 해주었다.

 

 

 

 

참고
- https://poiemaweb.com/js-function
- https://opentutorials.org/course/743/6544
- https://www.zerocho.com/category/Javascript/post/5740531574288ebc5f2ba97e

 

반응형

관련글 더보기

댓글 영역