누가봐도 인생 1회차의 기록장

개발공부/JavaScript 책

코어 자바스크립트 #06 (클로저)

김놀먹 2021. 12. 8. 16:53

와.. 정말 너무 어려운 개념이다... 

이해도 안 되고 집중도 안돼서 흐린 눈으로 책 본 것 같다ㅠㅠ 

다음에 볼 때 더 집중해봐야지!


클로저의 의미 및 원리 이해

클로저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 : 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인 형태로 구성한 것. 부분 적용 함수와 기본적인 맥락은 비슷하지만 커링은 한 번에 하나의 인자만 전달하는 것을 원칙으로 하고 중간 과정상의 함수를 실행한 결과는 그다음 인자를 받기 위해 대기만 할 뿐 마지막 인자가 전달되지 전까지는 원본 함수가 실행되지 않는다.