본문 바로가기
JavaScript 기초

[JavaScript] 클로저 (Closure)

by 개미는뚠뚠딴 2020. 9. 15.
반응형

오늘은 클로저 (Clsure)에 대해서 공부했다. 클로저는 외부 함수의 변수에 접근이 가능한 내부 함수로 함수 안에 함수가 있는 형태이다. 외부 함수에서 내부 함수를 리턴 시켜줄 수 있기 때문에 내부 함수로 값이 저장이 가능하다. 또한 접근 범위를 지정해 줄 수 있어서 private 지정자처럼 사용이 가능하다. (객체 지향 프로그래밍의 특징 중 하나인 은닉성과 연관 지을 수 있다.)

 

함수의 외부에서는 내부로 접근이 불가능하지만 내부에서는 외부에 선언된 변수를 참조할 수 있기 때문에 유용하게 사용이 가능하다. 또한 클로저는 마치 객체처럼 사용이 가능하다. 

 

function myUser(name, age){
  return function addUser() {
    console.log(`이름은 ${name} 이고, 나이는 ${age} 입니다.`);
  }
}

let leo = myUser('leo', 25); 
console.log(leo()); // 이름은 leo 이고, 나이는 25 입니다.

let abc = myUser('abc', 12);
console.log(abc());

 

이렇게 값을 할당 시켜 줄 수도 있다. 

 

또한 외부함수의 값을 고정시켜서 사용할 수 도 있는데

 

커링(함수 하나가 n개의 인자를 받는 대신, n개의 함수를 만들어 각각 인수를 받게 함)을 통해서 한 번 알아보겠다.

 

function myUser(name, age){
  return function addUser(addAge) {
    console.log(`이름은 ${name} 이고, 나이는 ${age + addAge} 입니다.`);
  }
}

let leo = myUser('leo', 25); 
console.log(leo(-5)); // 이름은 leo 이고, 나이는 20 입니다.
console.log(leo(3)); // 이름은 leo 이고, 나이는 28 입니다.
console.log(leo(5)); // 이름은 leo 이고, 나이는 30 입니다.

leo라는 값은 고정시킨 채 age 값만 변화시켰다.

 

 

클로저 모듈 패턴을 이용하면 변수를 스코프 안 쪽에 가두어 함수 밖으로 노출시키지 않고도 변수에 접근이 가능한데 이를 통해 private 지정자처럼 사용이 가능하다.

 

function myNum(){
  let privateNum = 0; // 함수 외부에서 값 변경 불가
  let obj = {
  	plus : function(){
      privateNum += 1;
    },
    minus : function(){
      privateNum -= 1;
    },
    getNum : function(){
      return privateNum;
    }
  };
  return obj;
}

let num1 = myNum();
num1.plus();
num1.minus();
num1.minus();
num1.getNum(); // -1

let num2 = myNum();
num2.plus();
num2.plus();
num2.getNum(); // 2

 

두 변수가 각각 다른 값을 가리키면서 privateNum에 직접적으로 접근하지 않고 간접적으로 접근하고 있다. 

반응형

댓글