javaScript 클로저(closure)의 개념
2022년 07월19일
클로저란?
클로저는 자바스크립트에서만 사용되는 개념이 아니라 일급객체를 사용하는 언어들의 중요한 특성입니다. (스칼라, 하스켈, ..)
MDN 클로저 정의
클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합이다.
일급 객체란?
보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 합니다.
1960년에 크리스토퍼 스트래치라는 사람이 일급객체에 정의를 내렸습니다.
- 모든 요소는 함수의 실제 매개변수가 될 수 있다.
- 모든 요소는 함수의 반환 값이 될 수 있다.
- 모든 요소는 할당 명령문의 대상이 될 수 있다.
- 모든 요소는 동일 비교의 대상이 될 수 있다.
클로저, 렉시컬 환경이란?
저도 아직은 완벽히 이해하는 것은 아니지만 이해한 것을 작성해 보자면 클로저란 반환된 내부함수가 자신이 선언됐을때의 환경을 기억하는 것을 의미 합니다. 즉 렉시컬환경은 외부함수와 내부함수 2가지 함수가 있을때 내부함수가 선언이 될때 외부함수에 있는 변수들과 메소드들을 기억하는 것을 의미해서 외부함수를 사용하지 않고 내부함수만으로 외부함수의 프로퍼티와 메소드에 접근할수 있습니다.
간단한 예제
위 코드를 보면 getState에 b함수가 들어가 있다. 그리고 getState함수를 사용하면 b함수가 실행되는데 name이라는 변수를 사용할수가 있습니다. 그 이유는 b함수를 받았을때 b함수는 외부함수인 a함수의 환경을 기억하고 있기 때문에 변수 name을 사용할수 있게 된것이죠
클로저를 사용하는 이유
-
최신상태 유지
클로저가 가장 유용하게 사용되는 상황은 현재 상태를 기억하고 변경된 최신 상태를 유지할때 가장 유용하게 사용할수 있습니다. 클로저는 기본적으로 외부 함수의 프로퍼티, 메소드를 기억하고 있기때문에 외부함수 프로퍼티의 값이 변경되어도 최신상태를 유지해야 할때 사용되고 만약 클로저 기능이 없다면 상태를 유지하기 위해서는 전역변수로 사용 할수 밖에 없기때문에 누구든지 접근할수 있어서 오류의 원인이 됩니다.
-
정보 은닉
클로저는 정보은닉 즉 클래스기반의 언어의 private를 흉내낼수 있습니다. 예를들어 외부함수를 이용해서 값을 변경하는 기능을 구현하지 못하게 애초에 외부함수를 쓰지않고 오직 내부함수를 이용해서만 외부함수의 프로퍼티에 접근 할수 있게하면 외부함수에 접근을 못하는 것과 동일한 기능을 할수있게 되기 때문에 정보의 은닉을 사용할수있습니다.
끝으로 클로저를 정리해 보았습니다. 아직 클로저라는 개념을 확실히 알고 있다고 자신할수 없기 때문에 더 공부해야겠습니다.