기록을 뒤져보니 개발 공부 18일차에 클로저에 대해 블로깅한 적이 있었습니다. 지금 보니 아주 틀리게 쓰진 않은 것 같긴 한데, 당시에는 명확히 개념이 이해되지 않아서 애를 먹었던 기억이 나네요.
오늘은 클로저를 다시 정리해보면서 가급적 제 언어로 풀어내보려고 합니다.
무엇이 클로저인지를 보려면 2가지를 확인하면 됩니다.
이렇게 2가지를 만족할 경우 리턴되는 내부 함수를 클로저 함수라고 할 수 있습니다.
롤이라는 게임을 비유로 들어보겠습니다. 프로 경기가 열리면 게임이 시작되기 전 선수들은 저마다 캐릭터를 선택합니다. 경기가 시작되면 그 게임 환경은 폐쇄가 되고, 선수들은 저마다 선택한 캐릭터를 가지고 게임을 진행하게 되죠.
장비 하나를 구매하는 것도, 미니언 막타를 치거나 놓치는 것도 결국은 인게임 내에서 일어나는 일입니다. 외부에서 경기를 관람하는 저는 게임 내에서 벌어지는 일들에 접근할 수 없죠. 경기를 중계하는 중계진도 마찬가지입니다.
외부 함수를 게임이 시작되기 전 상황으로, 내부 함수를 인게임 상황으로 가정해 보겠습니다. 결국 게임이 시작되고 나면(클로저 함수) 게임을 시작하면서 결정한 캐릭터들은 인게임 안에서만 접근이 가능합니다. 어떤 선수의 픽이 마음에 들지 않는다고 해서 관전자가 멋대로 캐릭터를 변경할 수는 없죠. 클로저 또한 일단 한 번 형성되고 나면, 외부 함수의 변수들은 오직 리턴되는 내부 함수를 통해서만 접근이 가능합니다.
클로저를 활용하면 특정한 변수를 안전하게 관리할 수 있습니다.
게임의 예제로 돌아가봅시다. 인게임 내의 상황을 외부에서 바꿀 수 있을까요? 만약 그렇다면 우리는 그걸 핵이라고 부릅니다. 그리고 핵의 사용은 게임을 망하게 하는 지름길이죠.
변수도 마찬가지입니다. 어떠한 변수가 여기저기에서 영향을 받기 시작한다면, 그 변수는 예기치 못한 결과를 만들어낼 가능성이 높아집니다. let, const 라는 키워드를 도입한 것도 결국은 변수를 보다 더 안전하게, 의도한대로 사용하기 위해서인 것처럼, 클로저 또한 특정한 변수를 오직 리턴되는 내부의 함수를 통해서만 관리할 수 있도록 합니다. 이를 은닉(hiding)이라고 하죠.
클로저는 처음에는 어렵지만 선행 지식들을 이해하기만 하면 난이도가 많이 하락한다고 생각합니다. 다만 선행 지식들이 이론 중심이기 때문에 어느 정도 내공이 쌓인 후에 다시 살펴보는 편을 적극 추천하고 싶습니다.
선행 지식으로 스코프, 렉시컬 스코프, 실행 컨텍스트와 렉시컬 환경 정도를 들 수 있습니다. 조금 더 깊은 이론적인 내용에 관심이 있으시다면 위의 내용들을 연관 키워드로 검색해보시면 좋을 것 같습니다.