클로저 개념은 책이랑 유튜브로 여러 번 봤어요. "함수가 선언될 때의 스코프를 기억한다" 뭐 이런 설명이요. 근데 볼 때는 알겠는데 이걸로 private 변수를 만든다는 얘기가 계속 나오는데 그게 실제로 어디 쓰이는 건지 감이 안 와요.


예제로 나오는 카운터는 저도 따라 쳐봤어요.


function createCounter() {
  let count = 0;
  return {
    increment() { count++; return count; },
    getCount() { return count; }
  };
}
const c = createCounter();
c.increment(); // 1
console.log(c.count); // undefined


여기서 c.count 로 직접 못 건드리고 undefined 나오는 게 신기하긴 했어요. count 변수가 밖에서 안 보이니까 이게 private 다 이거잖아요. 근데 제 솔직한 의문은 이거예요. 그냥 객체에 count 를 넣어두고 조심해서 안 건드리면 되는 거 아닌가요? 왜 굳이 이렇게 함수로 감싸서 숨겨야 하나요?


그리고 요즘은 클래스에 # 붙이면 private 필드가 된다고 하던데요.


class Counter {
  #count = 0;
  increment() { this.#count++; }
}


이게 있으면 클로저로 숨기는 방식은 이제 안 써도 되는 건가요? 아니면 상황에 따라 클로저 방식이 더 나은 경우가 따로 있나요? 실무에서 클로저로 뭔가 숨겨서 쓰는 진짜 예시가 있으면 하나만 보여주시면 확 이해될 것 같아요. 예를 들어 라이브러리 만들 때 쓴다든가 그런 거요. 지금은 개념만 붕 떠 있고 "그래서 이걸 언제 쓰지" 하는 상태라 답답하네요.