다시 정리하는 클로저
정리하게 된 계기
최근에 네이버 웹툰 체험형 인턴 면접을 보았다.
첫 면접이었고, 긴장해서 그런가.. CS와 관련된 질문에서 어버버하면서 대답을 했었다.
그 중 하나가 클로저에 대한 질문이었다.
그래서, 집에 와서 생각을 해보니 클로저에 대한 오개념을 대답했음을 알았다.
두 번 다시 같은 실수를 하지 않도록 클로저에 대해 다시 정리하고자 한다.
클로저(Closure)의 어원
영어에서 클로저(Closure)
라는 말은 정말 다양하게 쓰인다.
네이버 사전에서 검색을 하면 다음과 같은 뜻이 있다.
- 명사 (공장, 학교, 병원 등의 영구적인) 폐쇄(되는 상황)
- 명사 (도로·교량의 일시적) 폐쇄
- 명사 (힘든 일의) 종료[종결]
Close의 명사형으로써 폐쇄, 종료, 끝, 닫힘 등의 의미로 쓰인다.
다만, 이렇게 사전적 의미로만 정의하면 혼란이 생기기 쉽다.
JS에서 클로저의 어원은 위에 기반한 것이 아니라, 수학과 컴퓨터 과학에서 폐합을 의미하는 Closure
에서 유래되었기 때문이다.
폐합은 보통 ~에 닫혀있다.이라는 표현으로 많이 쓰인다.
예를 들어서, 정수 집합은 덧셈 연산에 대해 닫혀있다. 혹은 정수 집합은 덧셈 연산에 대해 폐합을 가진다.과 같은 표현으로 쓰인다.
정수(Integer)
연산의 경우, 사칙연산(+, -, *, /)
을 해도 그 결과 값은 정수 집합에 다시 해당한다.
어떤 행위의 결과가 자신의 집합으로 귀결되는 것을 Closure
라고 한다.
JS에서 클로저는 어떻게 표현되는가?
JS에서 클로저를 위와 같이 표현할 수 있다.
outer
함수 내부에 있는 inner
함수가 outer
함수 외부에서 outer
함수 범위(scope)
안에 있는 변수 a
를 참조하는 것이다.
클로저에 대한 다양한 표현
클로저(Closure)
는 자바스크립트의 고유 개념이 아니다.
함수형 프로그래밍 언어
에서 등장하는 보편적인 특성
이다.
러스트 공식 가이드에서 캡쳐한 내용이다.
러스트에서도 보다시피 클로저를 다루는 것을 볼 수 있다.
자바스크립트의 고유 개념이 아니다보니, ECMAScript
명세에서도 클로저의 정의를 다루고 있지 않다.
굳이 이것 때문은 아니지만, 다양한 문헌에서 클로저를 제각각 정의하고 있다.
- 자신을 내포하는 함수의 컨텍스트에 접근할 수 있는 함수
- 더글라스 크록포드, <<자바스크립트 핵심 가이드>>, 한빛미디어(p68)