와.. 정말 너무 어려운 개념이다...
이해도 안 되고 집중도 안돼서 흐린 눈으로 책 본 것 같다ㅠㅠ
다음에 볼 때 더 집중해봐야지!
클로저의 의미 및 원리 이해
클로저Closure : 어떤 함수 A에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달한 경우 A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상
- 함수를 선언할 때 만들어지는 유효 범위가 사라진 후에도 호출할 수 있는 함수 - 존 레식, 《자바스크립트 닌자 비급》, 인사이트(p116)
- 이미 생명주기가 끝난 외부 함수의 변수를 참조하는 함수 - 송형주 고현준, 《인사이드 자바스크립트》, 한빛미디어(p157)
- 자신이 생성될 때의 스코프에서 알 수 있었던 변수들 중 언젠가 자신이 실행될 때 사용할 변수들만을 기억하여 유지시키는 함수 - 유인동, 《함수형 자바스크립트 프로그래밍》, 인사이트(p31)
※ 주의할 점? 바로 '외부로 전달'이 곧 retrun만을 의미하는 것은 아니라는 점!
클로저와 메모리 관리
메모리 누수의 위험을 이유로 클로저 사용을 조심해야 한다거나 심지어 지양해야 한다고 주장하는 사람들도 있지만 메모리 소모는 클로저의 본질적은 특성일 뿐 오히려 이런 특성을 정확히 이해하고 잘 활용하는 것이 중요. 과거에는 의도치 않게 누수가 발생하는 상황들이 있었지만 그중 대부분은 최근의 자바스크립트 엔진에서는 발생하지 않기 때문에 이제는 의도대로 설계한 '메모리 소모'에 대한 관리법만 잘 파악해서 적용하는 것으로도 충분하다.
※ 메모리 누수? 개발자의 의도와 달리 어떤 값의 참조 카운트가 0이 되지 않아 GC Garbage Collector 의 수거대상이 되지 않는 경우
↓
'메모리 소모' 관리법 : 클로저는 어떤 필요에 의해 의도적으로 함수의 지역변수를 메모리를 소모하도록 함으로써 발생하기 때문에 그 필요성이 사라진 시점에는 더는 메모리를 소모하지 않게 해 주면 된다. 참조 카운트를 0으로 만들면 언젠가 GC가 수거해갈 것이고, 이때 소모됐던 메모리가 회수되는 것.
↓
참조 카운트를 0으로 만드는 방법 : 식별자에 참조형이 아닌 기본형 데이터(보통 null 이나 undefined)를 할당하면 된다.
클로저 활용 사례
- 콜백 함수 내부에서 외부 데이터를 사용하고자 할 때
- 접근 권한 제어information hiding (정보 은닉) : 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 현대 프로그래밍 언어의 중요한 개념
- public
- private
- protected
- 부분 적용 함수partially applied function : n개의 인자를 받는 함수에 미리 m개의 인자만 넘겨 기억시켰다가 나중에 (n-m)개의 인자를 넘기면 비로소 원래 함수의 실행 결과를 얻을 수 있게끔 하는 함수
- 커링 함수currying fucntion : 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인 형태로 구성한 것. 부분 적용 함수와 기본적인 맥락은 비슷하지만 커링은 한 번에 하나의 인자만 전달하는 것을 원칙으로 하고 중간 과정상의 함수를 실행한 결과는 그다음 인자를 받기 위해 대기만 할 뿐 마지막 인자가 전달되지 전까지는 원본 함수가 실행되지 않는다.
'개발공부 > JavaScript 책' 카테고리의 다른 글
코어 자바스크립트 #08 (클래스) (0) | 2021.12.09 |
---|---|
코어 자바스크립트 #07 (프로토타입) (0) | 2021.12.08 |
코어 자바스크립트 #05 (콜백함수) (0) | 2021.12.07 |
코어 자바스크립트 #04 (this - 2 명시적으로 this를 바인딩하는 방법) (0) | 2021.12.02 |
코어 자바스크립트 #03 (this - 1 상황에 따라 달라지는 this) (0) | 2021.12.02 |