Javascript Closure는 Private 변수 만드는 용도인가?

Seunglak Choi
네이버 플레이스 개발 블로그
3 min readApr 7, 2021

저는 개발자 채용을 위해 아마 면접을 천 번 이상 했을 듯 합니다. “Javascript Closure가 무엇인가?”는 저의 단골 질문인데요. 열에 아홉은 Private 변수 만드는 용도라는 답변이 옵니다.

정말 그럴까요? Private 변수는 closure의 한 가지 응용일 뿐입니다. 그마저도 요새는 잘 안씁니다. ES6에 class가 있으니까요. 핵심은 그것이 아니지요. 왜 많은 분들이 이런 지식을 가지고 계시게 된 것인지..

Closure는 functional programming에서 나온 개념입니다. 최근 몇 년 사이 나온 언어들은 functional한 경우가 많지요. Swift, Kotlin 등의 언어들은 모두 closure가 있습니다. Javascript는 더 이전부터 functional programming 개념을 가지고 있었고요. 그래서 closure 개념의 이해는 요새 언어들을 학습하는데 매우 중요합니다.

예를 보는 것이 이해가 빠르지요.

function makeAdder(x) {
return function(y) {
return x + y; // 상위 scope의 x를 참조
};
}
var add10 = makeAdder(10)
// makeAdder가 종료되어 x는 stack에서 pop되었음

console.log(add10(5)) // function(y) 실행. closure 덕분에 x 값 참조 가능

function(y)x를 참조하고 있습니다. 그런데 말입니다. function(y) 실행 시점이 makeAdder 함수 종료 이후 입니다. 그럼 x 는 메모리에 없겠지요? 스택에서 pop 되었을 테니까요.

이 때 closure가 필요합니다. function(y)가 정의될 때 상위 scope의 변수 값들을 메모리에 저장해 둡니다. 그래서 x 값을 참조할 수 있습니다.

Functional programming 용어로 다시 설명해 보겠습니다. Higher-order function 때문에 closure가 필요합니다. Higher-order function은 함수를 리턴할 수 있습니다. 리턴되는 함수를 first-class function이라고 하죠. 이 first-class function은 lazy execution 합니다. 그래서 정의될 당시의 상위 scope의 변수 값을 메모리에 저장해 둬야 합니다.

이제 호기심이 많은 개발자 분들은 “그럼 higher-order function은 왜 필요한 거야?”라는 질문이 생기실 듯 합니다. Functional programming 기초 이론을 공부하시면 좋습니다. 앞서 얘기했듯이 요즘 언어들은 대부분 functional 이거든요.

--

--