시스템아 미안해

Chapter 4 - Item 35. private 데이터를 저장할땐 클로저를 사용하라 본문

책/Effective JavaScript

Chapter 4 - Item 35. private 데이터를 저장할땐 클로저를 사용하라

if else 2025. 8. 10. 19:42

JavaScript에는 private 키워드가 없었기 때문에(ES2022 전),
외부에서 접근 불가능한 데이터를 만들려면 클로저를 사용했다.

function Counter() {
  let count = 0; // private 변수
  this.inc = function() {
    count++;
    return count;
  };
  this.dec = function() {
    count--;
    return count;
  };
}

const c = new Counter();
console.log(c.inc()); // 1
console.log(c.count); // undefined (직접 접근 불가)

 

  • count 변수는 생성 시점의 스코프 안에만 존재
  • 외부에서 접근하거나 수정할 수 없고, 오직 메서드를 통해서만 조작 가능

 

 

 


 

 

ES6 이후 class 문법에서도 이 방식은 여전히 가능하지만,
ES2022부터는 정식 private 필드 문법(#)이 도입되어 더 간결하게 쓸 수 있다.

class Counter {
  #count = 0; // private 필드
  inc() {
    return ++this.#count;
  }
  dec() {
    return --this.#count;
  }
}

const c = new Counter();
console.log(c.inc()); // 1
console.log(c.#count); // SyntaxError (직접 접근 불가)

 

 

 

 

  • ES2022 이상의 환경이라면 #private 필드를 쓰는 것이 간단하고 안전하다.
  • 하지만 라이브러리나 브라우저 지원 범위 때문에 아직 클로저 방식을 쓰는 곳도 많다.
  • 클로저 방식은 private 상태를 인스턴스 단위로 안전하게 유지할 수 있다는 장점이 있다.
  • 반대로, 메서드도 클로저로 생성되기 때문에 인스턴스마다 함수 객체가 생겨 메모리 비용이 커질 수 있다.