본문 바로가기

Programming/Javascript

12. Javascript 클로저(Closure)(1) - 클로저의 정의 1

javascript logo image

 

 

Javascript에서 클로저는 나름대로 중,고급(?)단계로 진입하기 위한 가장 큰 장벽이자 숙제인 개념입니다. 만일 프로그래밍 언어에 익숙하신 분들이라면 다른 언어와 조금 차별화되는 개념일지라도 이 개념의 맥락과 용도만 이해한다면 어렵지 않게 학습할 수 있는 내용이지만, Javascript를 통해 프로그래밍 언어를 처음 접하신 분들이라면 다소 어렵게 느껴질 수 있는 개념입니다. 

 

(지금까지도 그래왔지만) 이번 아티클에서는 Javascript를 첫 프로그래밍 언어로 학습하고 계신 분들이 읽고 있다고 가정하고 가능한 자세히 차근차근 설명을 진행해 보도록 하겠습니다. 

 

 

 


 

클로저(Closure)의 개념

우선은 클로저가 무엇인지, 간단히 정의를 내려보고 설명을 진행해 보도록 하겠습니다. 우선, 단어만 듣고 보면 왜 '클로저'이지? 뭐가 폐쇄되었다는 거지? 란 생각이 들 수도 있습니다. 우선, 먼저 짚고 넘어가자면 '클로저(Closure)'라는 단어가 갖는 추상적인 개념을 통해 직관적으로 개념을 이해하려 들면 문제가 복잡해집니다. 우선은 단어의 뜻에 집착하지 않는 것을 권합니다. 

 

우선, 클로저는 무엇이냐? 라는 질문에 간단히 답해 보겠습니다. 클로저는 함수입니다. 이것을 명심해야 합니다. 그럼 다음 질문으로 넘어가야죠? 어떤 함수냐? 어떤 특징을 가진 함수냐?라는 질문에 답하면 됩니다. 클로저의 특징은 다음과 같습니다.

 

"Javascript의 클로저는 컨텍스트가 종료된 외부 함수의 변수를 참조하는 함수이다."

 

자, 위의 문장이 이해가 가시나요? 아마 높은 확률로 이해가 가지 않을 것입니다. 하지만 예제를 통해 살펴보면 쉽게 이해될 수 있는 개념이기도 합니다. 하지만, 이를 이해하기 위해서는 선행 지식이 필요합니다. 바로 직전에 학습한 실행 컨텍스트와 변수 객체, 스코프 체인에 대한 개념입니다. 만일 본인이 이 개념들을 대충 훑어보기만 했거나 제대로 이해하지 못한 상태에서 클로저를 이해하려고 덤비게 되면 당연히 이해가 어려울 수밖에 없습니다. 만일 본인이 실행 컨텍스트와 스코프 체인에서 배운 내용들이 기억이 잘 나지 않거나 자신이 없다면, 반드시 다시 한번 학습하고 오시기를 추천드립니다. 

 

 


 

일급 객체로서의 Javascript 함수

서론이 길다고 짜증내지 마시고(!!) 차근차근 따라와 주세요. 대부분 잊어버리셨겠지만, Javascript에서 함수는 일급 객체로 취급된다는 내용을 배운 적이 있습니다. 이때 일급 객체로서 함수가 갖는 여러 가지 특징이 있는데, 여기서 중요한 것은 "함수 자체를 리턴할 수 있다."는 개념입니다. 당연한 것 아니야? 라는 생각이 들 수 있지만 쉽게 말해 '함수 선언문 자체를 통째로 리턴하여 다른 변수에 대입한다'라는 개념을 본인이 잘 이해하고 있는지 확인해 보시기 바랍니다. 

 

클로저는 함수라고 했습니다. 클로저의 특성은 바로 이 함수가 리턴되었을 때 드러나게 됩니다. 앞에서 실행 컨텍스트의 개념이 잘 잡혀있어야 한다고 말씀드렸죠? 여기서부터 실행 컨텍스트, 변수 객체의 개념이 없거나 익숙하지 않다면 설명이 의미 없어집니다.

 

우리는 실행 컨텍스트에서 스코프 체인을 통해, 어떤 변수를 참조할 수 있는 인식의 범위와 조건이 정해져 있음을 배웠습니다. 스코프 체인에 없는 변수라면 의도한 대로 참조할 수가 없는 것이죠. 이것이 기본 원칙입니다. 하지만 클로저는, 우리가 학습한 이 변수 적용 범위 원칙을 깨버리는, 예외적인 특성을 갖게 됩니다. 

 

한마디로 '원래는 참조할 수 없는 변수를 예외적으로 참조할 수 있는 함수'가 되는 것입니다. 이것이 클로저라는 함수의 특징입니다. 이제 선행 지식이 필요한 이유를 느끼셨나요? 기본적인 원칙을 알고 있어야, 그 예외 상황을 이해할 수 있기 때문입니다. 

 

이제 다음 아티클에서 예제 코드와 실행 컨텍스트 도식을 함께 사용해 실제 클로저의 구현 과정을 살펴보겠습니다.