본문 바로가기

개인공부 기록/JavaScript

[JavaScript] 클로저(Closuer) (2) - 캡슐화, 은닉화

 

은닉화가 왜 필요한가?

먼저 은닉화라는게 왜 필요한지, 어떻게 사용해야되는지 알아볼 필요가 있겠죠?

자바스크립트와 다른언어(C, C++, ...)들과의 차이점 중 한가지는 객체의 Private한 속성을 만들수 없다는 거에요. 그래서 아무나 변수에 접근할수 없도록, 특정한 방법들을 사용하여 자바스크립트에도 실제로 Private가 아니지만  Private한 것처럼 사용하는 방법을 은닉화라고 이야기하기로 했다고 해요.

 

즉시실행함수(IIFE, Immediately Invoked Function Expression)

은닉화를 하기위해 사용되는 즉시 실행함수는 정의되자마자 즉시 실행되는 JavaScript Function이다.

IIFE 내부에서 정의된 변수는 외부에서 접근이 불가능하다.

(function () {
  var a = 'a';
})();

console.log(a); // a is not defined

 

 

즉시실행함수(IIFE)에 변수를 할당하면 함수가 아닌 함수의 실행결과만 저장된다.

var result = (function () {
    var name = "Barry";
    return name;
})();
// 즉시 결과를 생성한다.
result; // "Barry"

 

클로저를 통한 은닉화

function Hello(name) {
  this._name = name;
}

Hello.prototype.say = function() {
  console.log('Hello, ' + this._name);
}

let a = new Hello('박사');
let b = new Hello('대사');

a.say() //Hello, 박사
b.say() //Hello, 대사

a._name = 'anonymous'
a.say() // Hello, anonymous

위 코드의 Hello 함수를 통해 생성된 객체들은 _name 이라는 변수를 갖게 되는데요 여기서 underscore(_)는JavaScript에서 Private 변수로 사용하겠다는 암묵적인 룰이라고 합니다. 하지만 암묵적인 룰이라 접근을 안하는거지 접근이 못하는건 아닙니다.

그래서 클로저를 사용하여 외부에서 직접적으로 변수에 접근할 수 없도록 캡슐화(은닉화) 할 수 있습니다.

 

function hello(name) {
  let _name = name;
  return function () {
    console.log('Hello, ' + _name);
  };
}

let a = new hello('박사');
let b = new hello('대사');

a() //Hello, 박사
b() //Hello, 대사

 

클로저를 이용한 접근 제한

function a(){
  let temp = 'a' 
  
  return temp;
} 

// console.log(temp)  error: temp is not defined
const result = a()
console.log(result); //a

위와 같은 방식으로 함수를 변수에 담아 사용하게되면 private하지 않지만, 변수에 대한 직접적인 접근을 막을 수 있습니다.

Recent Posts
Popular Posts
Recent Comments