ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코어 자바스크립트 북스터디 5주차] 5장. 클로저
    📝 기록/독서 기록 2021. 12. 16. 22:28

    ✅ 삼색 볼펜법 활용
    빨간색: 핵심내용
    파란색: 핵심은 아니지만 중요하다고 생각되는 내용
    초록색: 흥미로운 내용

    5장 클로저

    1. 클로저의 의미 및 원리 이해

    클로저는 여러 함수형 프로그래밍 언어에서 등장하는 보편적인 특성.
    자바스크립트 고유의 개념이 아니라서 ECMAScript 명세에서도 클로저의 정의를 다루지 않음.

    MDN 클로저 정의
    "A closure is the combination of a function and the lexical environment within which that function was declared."
    "클로저는 함수와 그 함수가 선언될 당시의 lexical environment의 상호관계에 따른 현상"

    선언된 당시의 lexical environment는 실행 컨텍스트의 구성 요소 중 하나인 outerEnvironmentReference에 해당한다.

    내부 함수에서 외부 변수를 참조하는 경우에 한해서만 combination, 즉 '선언될 당시의 LexicalEnvironment와의 상호관계'가 의미 있음.

    "어떤 함수에서 선언한 변수를 참조하는 내부함수에서만 발생하는 현상"
    → 다시 말해 "외부 함수의 LexicalEnvironment가 가비지 컬렉팅 되지 않는 현상"

    가비지 컬렉팅의 동작 방식 때문에 클로저가 가능한 것인데, 이는 가비지 컬렉터는 어떤 값을 참조하는 변수가 하나라도 있다면 그 값을 수집 대상에 포함시키지 않기 때문.

    정리하자면, 클로저란 어떤 함수 A에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상을 말한다.

    2. 클로저와 메모리 관리

    클로저는 객체지향과 함수형을 모두 아우르는 매우 중요한 개념.
    메모리 누수의 위험을 이유로 클로저 사용을 조심해야 한다거나 심지어 주장하는 사람들도 있지만 메모리 소모는 클로저의 본질적인 특성.

    클로저는 어떤 필요에 의해 의도적으로 함수의 지역변수를 메모리로 소모하도록 함으로써 발생함. 그렇기 때문에 필요성이 사라진 시점에 메모리를 소모하지 않게 처리해주면 됨.

    참조 카운트를 0으로 만들면 언젠가 GC가 수거해갈 것이고, 이때 소모됐던 메모리가 회수됨.
    참조 카운트를 0으로 만드는 방법은 식별자에 참조형이 아닌 기본형 데이터(보통 null이나 undefined)를 할당하면 됨.

    3. 클로저의 활용 사례

    3-1. 콜백 하수 내부에서 외부 데이터를 사용하고자 할 때

    ...

    3-2. 접근 권한 제어(정보 은닉)

    클로저를 활용하면 외부 스코프에서 함수 내부의 변수들 중 선택적으로 일부의 변수에 대한 접근 권한을 return을 활용하여 부여할 수 있다.

    closure라는 영어 단어는 사전적으로 '닫혀 있음, 폐쇄성, 완결성' 정도의 의미를 가진다.

    3-3. 부분 적용 함수

    부분 적용 함수란, n개의 인자를 받는 함수에 미리 m개의 인자만 넘겨 기억시켰다가, 나중에 (n-m)개의 인자를 넘기면 비로소 원래 함수의 실행 결과를 얻을 수 있게끔 하는 함수.

    3-4. 커링 함수

    커링 함수란 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출할 수 있게 체인 형태로 구성한 것을 말한다.

    부분 적용 함수와 달리 커링 함수는 필요한 상황에 직접 만들어 쓰기 용이함.
    필요한 인자 개수만큼 함수를 만들어 계속 리턴해주다가 마지막에 조합해서 리턴해주면 되기 때문.
    다만 인자가 많아질수록 가독성이 떨어진다.(콜백 지옥과 비슷한 모양새)

    화살표 함수로 구현하면 커링 함수를 한눈에 파악할 수 있어 이해하기 훨씬 수월함.

    각 단계에서 받은 인자들을 모두 마지막 단계에서 참조할 것이므로 GC되지 않고, 메모리에 차곡차곡 쌓였다가, 마지막 호출로 실행 컨텍스트가 종료된 후에야 비로소 한꺼번에 GC의 수거대상이 된다.

    커링 함수가 유용한 경우
    당장 필요한 정보만 받아서 전달하고 또 필요한 정보가 들어오면 전달하는 식으로 하면 결국 마지막 인자가 넘어갈 때까지 함수 실행을 미루는 셈. 이를 함수형 프로그래밍에서는 지연 실행(lazy execution)이라고 칭함.

    원하는 시점까지 지연시켰다가 실행하는 것이 요긴한 상황이라면 커링을 쓰기에 적합할 것.
    혹은 프로젝트 내에서 자주 쓰이는 함수의 매개변수가 항상 비슷하고 일부만 바뀌는 경우에도 적합함.

    5주 차 회고

    벌써 5주 차라니..! 시간이 참 빠른 것 같다. 그나저나 이번 주 '클로저'는 상당히 어려웠다. 읽으면서 뭔가 머릿속에 들어오는 게 아니라 계속 튕겨져 나가는 느낌을 받은.. 이거는 코드 하나하나씩 다 쳐보면서 내용도 다시 보고 여러 번 읽어서 학습을 해야겠다는 생각이 들었다. 그래도 읽고만 끝내는 게 아니라 내용들을 스터디원들이랑 같이 리뷰하고 내가 놓쳤던 부분들을 한 번씩 더 리마인드 하는 과정을 통해 각자의 생각들이 모여서 다양한 내용들을 얻어갈 수 있는 거 같다. 벌써 챕터가 두 개 밖에 안 남았는데 다음 주까지는 챕터 1부터 5까지 다시 한번 리뷰하는 시간을 가져야겠다.