[코어자바스크립트] 클로저

진형욱·2022년 8월 14일
0
post-thumbnail

객체란?

객체는 몇 가지 특수한 기능을 가진 연관 배열이다.

객체는 프로퍼티 값을 저장한다.

  • 프로퍼티 = 서랍장 안 파일
    • 프로퍼티 키는 문자열이나 심볼이어야 한다. (보통은 문자열)
    • 값은 어떤 자료형이나 가능하다.
  • 객체의 키 = 파일 각각에 붙어있는 이름표

복잡한 서랍장 안에서 이름표를 보고 원하는 파일을 쉽게 찾듯이, 객체에서 키를 이용해 프로퍼티를 쉽게 찾을 수 있다. (추가, 삭제도 마찬가지)

빈 객체를 만드는 방법

let user = new Object(); //객체 생성자 문법
let user = {}; // '객체 리터럴' 문법

중괄호를 이용해 객체를 선언하는 것을 객체 리터럴이라고 한다.

  • 점 표기법 : obj.property

  • 대괄호 표기법 : obj["property"]

    • 대괄호 표기법을 사용하면 obj[varWithKey]와 같이 변수에서 키를 가져올 수 있다.

객체-연산자

  • delete obj.prop : 프로퍼티를 삭제하고 싶을때

  • "key" in obj : 해당 key를 가진 프로퍼티가 객체 내에 있는지 확인할 때

  • for (let key in obj) : 프로퍼티를 나열할 때

const 상수 객체는 수정될 수 있습니다.

const user = {
name : "john"
};
user.name = "Pete";
alert(user.name) // Pete

constuser의 값을 고정하지만, 그 내용은 고정하지 않는다.
constuser를 전체적으로 설정하려고 할 때만 오류가 발생한다.

지금까지는 '순수 객체'라 불리는 일반 객체에 대해 학습했다.
객체 이외에도 다양한 종류의 객체가 있다.

  • Array - 정렬된 데이터 컬렉션을 저장할 때 쓰임(자주씀)
  • Date - 날짜와 시간 정보를 저장할 때(자주씀)
  • Error - 에러 정보를 저장할 때

정수 프로퍼티

  • 변형 없이 정수에서 왔다 갔다 할 수 있는 문자열을 의미한다.
    • 문자열 "49"는 정수로 변환하거나 변환한 정수를 다시 문자열로 바꿔도 변형이 없어서 정수 프로퍼티이다.
    • 하지만 '+49+', '1.2'는 정수 프로퍼티가 아니다.

클로저란?

함수형 프로그래밍 언어에서 등장하는 보편적인 특성이다.

MDN발췌 : 클로저는 함수와 그 함수가 선언될 당시의 lexical environment의 상호관계에 따른 현상.

즉 클로저란 어떤 함수에서 선언한 변수를 참조하는 내부함수에서만 발생하는 현상을 일컫으며
외부 함수의 Lexical Environment(JS 엔진이 현재 읽고 있는 코드의 scope혹은 environment를 말한다)가 가비지 컬렉팅 되지 않는 현상을 말한다.

가비지컬렉터란(CG)? 쓰레기 수집! 메모리 관리 기법중 하나로 프로그램이 동적으로 할당했던 메모리 영역중에서 필요없게 된 영역을 해제하는 기능.

밑에 예시는 외부함수에서 변수를 선언하고, 내부함수에서 해당 변수를 참조하는 형태의 코드이다.

var outer  = function () {

var a = 1;

var inner = function() {

console.log(++a);

};

inner();

};

outer();

inner함수 내부에서는 a를 선언하지 않았기 떄문에 값을 찾지 못하므로
지정된 상위 컨텍스트인 outerLexicalEnvironment에 접근해서 다시 a를 찾는다.

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

(외부로 전달이 곧, return만을 의미하는 것은 아니다.)


클로저와 메모리 관리

메모리 누수

개발자의 의도와는 달리, 어떤 값의 참조 카운트가 0이 되지 않아 GC(가비지 컬렉터)의 수거 대상이 되지 않는 경우에 하는 표현.

참조 카운트를 '0'으로 만드는 방법은?

  • 식별자에 참조형이 아닌, 기본형 데이터(보통null이나, undefined)를 할당하면 된다.

접근 권한 제어(정보은닉)

  • 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서, 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 현대 프로그래밍 언어의 중요한 개념.
  • 접근 권한에는 3가지 종류가 있다.
    • public
      • 외부에서 접근 가능한 것.
    • private
      • 내부에서만 사용 가능한 것. / 외부에 노출이 되지 않는 것.
    • protected

클로저를 활용해 접근권한을 제어하는 방법

  1. 함수 에서 지역변수 및 내부함수 등을 생성한다
  2. 외부에 접근권한을 주고자 하는 대상들로 구성된 참조형 데이터return한다.

부분적용 함수

  • n개의 인자를 받는 함수에 미리 m개의 인자만 넘겨 기억시키고,
    나중에 (n-m)개의 인자를 넘기면 비로소 원래 함수의 실행 결과를 얻을 수 있게끔 하는 함수.
  • this를 바인딩해야 하는 점을 제외하면 bind메서드의 실행 결과가 바로 부분 적용 함수이다.

디바운스

  • 짧은 시간동안 동일한 이벤트가 많이 발생할 경우 전부 처리하지 않고,
    처음 또는 마지막 발생한 이벤트에 대해 한 번만 처리하는 것.
    (프런트엔드 성능 최적화에 큰 도움을 주는 기능)
    • mousemove
    • wheel
    • scroll
    • resize에 적용하기 좋다.

참고
Symblo.for 메서드는 전역 심볼공간에 인자로 넘어온 문자열이 이미 있으면 해당 값을 참조하고, 선언돼 있지 않으면 새로 만드는 방식.

  • 어디서든 접근이 가능하고, 유일무이한 상수를 만들고자 할 때 적합함.

커링 함수

  • 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서, 순차적으로 호출될 수 있게 체인 형태로 구성한 것.
  • 커링은 한 번에 하나의 인자만 전달하는 것을 목적으로 한다.
    • 다만 인자가 많을수록 가독성이 떨어진다는 점이 있다.

지연실행
당장 필요한 정보만 받아서 전달하고 또 정보가 들어오면 전다하는 식으로 하면 결국 마지막 인자가 넘어갈 때까지 함수 실행을 미루는 식이다. 이를 지연실행 이라고 한다.
(원하는 시점까지 지연시켰다가 실행하는 것이 요긴한 상황이라면 커링을 쓰기에 적합하다.)


정리

  • 클로저란? 어떤 함수에서 선언한 변수를 참조하는 내부함수를 외부로 전달할 경우, 함수의 실행 컨텍스트가 종료된 이후에도 해당 변수가 사라지지 않는 현상
  • 내부함수를 > 외부함수로 전달하는 방법중 return 뿐만 아니라 콜백으로도 가능하다.
profile
90% of my problems magically disappeared when I slept well, ate well and went on regular walks

0개의 댓글