클로저 (Closure)
어떤 함수가 선언될 때의 자신의 렉시컬 스코프를 기억하고, 그 환경에 있는 변수에 접근할 수 있는 현상
사실 클로저라는 개념은 자바스크립트의 고유 개념이 아닙니다. 함수를 일급 객체로 취급하는 프로그래밍 언어(JavaScript, Dart, Python, Ruby 등)에서 사용되는 중요한 특성입니다. 여기서 궁금해집니다.
왜 클로저는 함수를 일급 객체로 취급하는 언어에서 등장하는가?
일급 객체(First-Class Citizen)의 의미
한마디로 함수도 값처럼 다룰 수 있다면 일급 객체라고 표현할 수 있습니다.
클로저는 함수가 선언될 당시의 외부 변수를 기억하고 유지하는 것이 핵심입니다. 함수가 일급 객체가 아니면, 함수를 다른 함수의 반환값으로 사용할 수도 없고, 다른 곳에서 실행할 수도 없기 때문에 클로저가 성립할 수 없습니다.
✅ 함수를 값처럼 다룰 수 있기 때문에 함수 내부에서 변수를 기억하는 클로저 개념이 등장한다.
✅ 클로저는 함수가 외부 환경을 기억하면서도 독립적인 실행 컨텍스트를 유지할 수 있도록 해준다.
✅ 함수가 일급 객체가 아니었다면, 클로저를 사용할 수 없었을 것이다.
✅ 자바스크립트는 함수형 프로그래밍 패러다임을 지원하기 때문에 클로저를 활용할 수 있다.
스코프와 렉시컬환경은 어떻게 다를까?
스코프(Scope)
변수가 접근할 수 있는 범위를 의미 (e.g., 블록 스코프, 함수 스코프, 파일 스코프)
렉시컬 환경(Lexical Environment)
실행 컨텍스트에 포함되며, 함수가 선언될 당시의 변수 참조 정보를 저장하는 객체
스코프(Scope)
단순히 접근 가능한 변수의 범위를 의미하지만, 클로저는 단순한 접근이 아니라 실행이 끝난 후에도 변수를 기억하는 것이 핵심입니다.
전역 스코프 (Global Scope), 지역 스코프 (Local Scope)가 있습니다.
지역 스코프(Local Scope)에는 블록레벨 스코프(let, const)와 함수레벨 스코프(var)가 있습니다.
자바스크립트에서는 스코프 체인(Scope Chain)을 통해 상위 스코프의 변수에 접근할 수 있습니다.
렉시컬 환경(Lexical Environment)
• 함수가 선언될 당시의 변수 저장소로, 실제로 클로저가 작동하는 원리입니다.
렉시컬 스코프
변수가 선언된 위치(정적인 코드 구조)를 기준으로 스코프가 결정되는 방식을 의미한다.
즉, 함수가 호출되는 위치가 아니라 함수가 선언된 위치에서의 스코프가 유지된다.
이를 정적 스코핑(Static Scoping)이라고도 한다.
자바스크립트는 렉시컬 스코프를 따르는 언어이다.
참고 자료
Last updated