[JavaScript] 클로저 (closure)란 무엇일까

2024. 11. 12. 18:42·Front end/JavaScript

모듈화의 핵심은 "응집도를 높히고 결합도를 낮춘다" 이다. 이 내용을 잘 생각하며 카운트를 증가시키는 함수를 만들어 본다면 어떻게 코드를 작성할 수 있을까

let cnt = 0;

function count(){
	return cnt ++
}

뭐 대충 이런식으로 작성할 수 있을 것이다. 이 때 cnt 변수가 함수 외부에 선언되었다. 이렇게되면 어떤 곳에서도 접근이 가능해 위험하고, count 함수를 다른곳으로 옮겨야 할때 항상 저 cnt 변수를 같이 가지고 가야하는 문제가 생긴다. 또 다른 경우에는 코드 200줄 아래에서 누군가가 cnt라는 변수를 사용한다면 에러가 날 수도 있다. 

 

이 때 cnt라는 변수를 count 함수 내부에 선언할 수만 있다면 위 문제 모두 해결된다. 그렇지만 count 함수를 호출할 때마다 cnt가 0으로 초기화되어 정확히 카운트를 할 수 없게된다. 이러한 문제점을 해결하기 위해 클로저가 탄생했다.

 

어떻게 클로저가 이러한 문제를 해결할 수 있을까? 바로 js 에서의 함수는 일급객체이기 때문이다. JavaScript에서 함수는 일급 객체이므로 함수의 반환값으로 사용할 수 있다. 클로저는 이 특성을 이용하여 내부 변수(cnt)를 외부에서 직접 접근하지 못하게 하면서, 함수가 외부 상태를 유지하게 만든다.

 

그럼 앞선 코드를 클로저를 이용해 작성해 보자

function createCounter() {
    let cnt = 0;

    return function() {
        return cnt++;
    };
}

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

 

이렇게 하나의 함수 내부에 카운트를 증가하는 function을 선언하여 해당 함수를 내보내 외부에서 사용할 수 있게 된다. 

 

이제 count를 1까지 올린 뒤 또 다른 변수를 createCounter를 사용하여 만들어보자.

function createCounter() {
    let cnt = 0;

    return function() {
        return cnt++;
    };
}

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

const _counter = createCounter();
console.log(_counter());
console.log(_counter());

아래의 새로 생긴 _counter를 사용한다면 다시 0이 출력된다. 새로운 메모리에 createCounter를 실행하기 때문에 cnt는 새로운 초기값으로할당된다. 

 

클로저를 배우며 느낀점은 getter와 setter를 사용해서만 접근이 가능한 데이터들을 보호하는 모습이 약간 클래스의 private랑 비슷한 느낌인 것 같았다.  

반응형
저작자표시

'Front end > JavaScript' 카테고리의 다른 글

[JavaScript] 음악 플레이리스트 프로그래스바 제작 (3)  (1) 2024.11.14
[JavaScript] 타입별 메서드와 제너레이트  (2) 2024.11.13
[JavaScript] 음악 플레이리스트 (2) 사운드 스펙트럼, 에러 극복기  (0) 2024.11.11
[JavaScript] 음악 스펙트럼 플레이어 만들기  (12) 2024.11.10
[JavaScript] 가비지 컬렉션  (1) 2024.11.09
'Front end/JavaScript' 카테고리의 다른 글
  • [JavaScript] 음악 플레이리스트 프로그래스바 제작 (3)
  • [JavaScript] 타입별 메서드와 제너레이트
  • [JavaScript] 음악 플레이리스트 (2) 사운드 스펙트럼, 에러 극복기
  • [JavaScript] 음악 스펙트럼 플레이어 만들기
re-hwi
re-hwi
재휘의 개발일기
    반응형
  • re-hwi
    Dvelopment blog
    re-hwi
  • 전체
    오늘
    어제
    • 재휘의 개발일기 (167)
      • 개발 (25)
        • 소프트웨어 공학 (25)
      • Python (18)
        • numpy (8)
      • OS (23)
        • 쉽게 배우는 운영체제 (23)
      • Front end (1)
        • HTML (6)
        • CSS (9)
        • JavaScript (18)
        • React (2)
        • Vue.js (5)
        • TypeScript (5)
        • Sass (3)
      • Algorithm (1)
        • 파이썬 알고리즘 인터뷰 (2)
        • 자료구조와 함께 배우는 알고리즘 (20)
      • Android (2)
        • 안드로이드 앱 프로그래밍 with 코틀린 (2)
      • Project (15)
      • Network (0)
      • etc (12)
        • 이것저것 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    scss
    오블완
    typeScript
    정보처리기사
    파이썬
    HTML
    numpy
    CSS
    REACT
    JavaScript
    FE
    자료구조
    알고리즘
    컴포넌트
    연결리스트
    표
    프론트엔드
    개발
    리액트
    타입스크립트
    sass
    플레이리스트
    js
    뷰
    TS
    vue
    자료흐름도
    정처기
    티스토리챌린지
    pwa
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
re-hwi
[JavaScript] 클로저 (closure)란 무엇일까
상단으로

티스토리툴바