클로져란?
클로져는 내부함수가 외부함수의 context에 접근하여 참조하는 함수를 클로져라고 합니다.
확인해볼까요?
inner 함수에는 x가 선언되어 있지 않지만 외부함수인 outer함수에 선언되어 있는 변수 x를 가져와서 x++를 실행하는 것을 확인 할 수 있습니다.
Javascript에서는 클로져를 통해 내부함수에 존재하지 않는 외부함수의 변수를 접근하여 값을 사용 또는 변경 할 수 있습니다.
또, 클로져는 외부함수에 선언된 변수를 내부함수에서 사용하는 경우 외부함수에 선언된 변수를 내부함수에도 사용하는 동안 외부함수는 소멸되지 않고 함수가 호출 되었을 당시의 환경을 메모리에 저장했다가 사용할 수 있습니다.
예를들어,
outer()를 test에 저장한 후 test()를 두번 호출한 경우, 첫번째 x2에는 11이 출력되고, 두번째 test()에서는 첫 번째 환경을 저장했다가 두번 째 test()에서 x2가 12가 출력되도록 했습니다.
근데 이게 보시면 test2에 outer()를 저장해서 호출했을 때 다시 x2가 11이 되는 것처럼 실제 값에 영향을 주는 것은 아닙니다.
이게 call by value와 call by reference라는 개념에 해당되는 부분으로 알고 있는데 다른 글에서 같이 공부해봐요.
그리고 outer() 외부에 선언된 변수 x는 outer() 외부에 존재하여 유효 범위가 아니기 때문에 outer()와는 상관이 없습니다. x3도 마찬가지죠.
이번에는 클로져를 통한 캡슐화에 대해서 알아볼게요.
클로져는 해당 함수가 실행되는 동안 함수의 유효 범위에 있는 변수와 함수를 가비지 컬렉션으로부터 보호합니다.
그렇기 때문에 변수의 유효범위를 제한하는 용도로 사용할 수 있는데 이것을 캡슐화라고 합니다.
예를 들면 자바에서 private를 해서 dto를 선언을 하는 경우처럼 말이죠.
이것으로 closure에 대한 글을 마치려고 합니다.
자바스크립트...하면 할수록 신기하면서도 이해가 잘안가는 것들이 많네요.
하면서 점점 부족함을 많이 알게됩니다.
공부하려고 작성하는 글이지만 진짜 열심히 공부해야겠다는 생각이 들어요.
잘못된 부분이 있으면 댓글로 달아주세요.
'IT > 개발 공부' 카테고리의 다른 글
JavaScript 함수사용 방법 (함수 선언문, 함수 표현식, 익명함수, 애로우펑션, 생성자 함수) (0) | 2020.06.21 |
---|---|
CORS & crossorigin (0) | 2020.06.18 |
이클립스(Eclipse) UTF-8 인코딩 (0) | 2020.06.07 |
MySQL 설치 (1) | 2020.06.07 |
아파치 톰캣 - 간단한 설명, 설치, 이클립스 연동 (0) | 2020.06.04 |