반응형

closure(클로저)는 함수와 그 함수가 선언된 스코프(scope) 사이의 관계를 말합니다. closure는 함수가 정의될 때의 환경을 기억하고, 그 환경에서 정의된 변수에 접근할 수 있는 기능을 제공합니다.

JavaScript의 함수는 first-class citizen이므로, 변수에 할당하거나 다른 함수의 인자로 전달할 수 있습니다. closure는 이러한 특징을 이용하여 함수를 반환하거나 함수를 전달할 때, 함수가 정의된 스코프에서 선언된 변수에 접근할 수 있는 것을 가능하게 합니다.

이는 외부 함수가 종료되어도 내부 함수가 참조하는 변수들이 유지되어 외부 함수의 변수에 접근할 수 있게 합니다.

function outerFunction(x) {
  return function innerFunction(y) {
    return x + y;
  };
}

const add5 = outerFunction(5);
console.log(add5(3)); // 8

위의 코드에서 outerFunction은 x 값을 매개변수로 받습니다. 그리고 innerFunction 함수를 반환합니다. innerFunction 함수는 y 값을 매개변수로 받습니다.

그리고 add5 변수에 outerFunction(5)의 결과를 할당합니다. 이 결과는 innerFunction 함수입니다. 그러므로 add5(3)을 실행하면 innerFunction 함수가 실행되고 x+y의 결과인 8이 출력됩니다.

아래의 코드에서는 createCounter 함수가 closure를 생성합니다.

function createCounter() {
  let count = 0;
  return function() {
    return ++count;
  };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

createCounter 함수가 반환하는 함수는 count 변수에 접근할 수 있어서, counter 변수에 저장된 함수를 호출할 때마다 count 값이 1씩 증가합니다.

closure는 코드의 캡슐화(encapsulation)에 많이 사용됩니다. 내부 함수가 외부 함수의 변수에 접근할 수 있기 때문에, 외부 함수의 변수를 숨기고 내부 함수만을 통해서 접근할 수 있는 기능을 구현할 수 있습니다.
위의 소스에서 count 변수는 closure를 통해 은닉화 되었습니다.

closure는 애플리케이션의 구조화와 모듈화에 큰 도움이 될 수 있습니다. 예를 들어, 아래의 코드에서는 private 변수를 통해서 외부에서 접근할 수 없는 값을 저장할 수 있습니다.

function Person(name) {
  let privateName = name;
  
  return {
    getName: function() {
      return privateName;
    },
    setName: function(newName) {
      privateName = newName;
    }
  };
}

const person = Person("John");
console.log(person.getName()); // John
person.setName("Jane");
console.log(person.getName()); // Jane

closure를 사용하면, 객체의 내부 상태를 외부에서 변경할 수 없게 할 수 있습니다. 그리고 내부에서만 접근할 수 있는 메소드를 구현할 수 있어서, 애플리케이션의 코드를 깔끔하게 유지할 수 있습니다.

closure의 장단점

장점

  1. 변수의 유지

closure는 외부 함수의 변수를 저장하여 외부 함수가 종료된 후에도 변수를 사용할 수 있습니다. 이는 메모리 효율성을 높여줍니다.

  2. 은닉성

closure를 사용하면 외부 함수의 변수와 내부 함수를 숨길 수 있어 변수의 접근을 제어할 수 있습니다.

  3. 단일 책임 원칙

closure는 함수의 역할을 구분하여 각각의 역할이 담당하는 변수와 함수를 분리할 수 있습니다. 이는 단일 책임 원칙을 준수하는 코드를 작성할 수 있게 해줍니다.

단점

  1. 메모리 낭비

closure를 사용하면 외부 함수가 종료된 후에도 내부 함수가 참조하는 변수를 메모리에 저장해야 하므로 메모리 낭비가 생길 수 있습니다.

  2. 코드 가독성

closure를 많이 사용하면 코드가 복잡해지고 이해하기 어렵습니다. 따라서 클로저를 사용할 때에는 적절한 주석과 코드 구조를 갖추어야 합니다.

반응형

+ Recent posts