캡슐화란 기본적으로 관련된 여러가지 정보(프로퍼티, 메서드)를 하나의 틀에 담는 것을 의미한다.
캡슐화에서 중요한 것은 정보의 공개 여부인데 자바와 C++같은 객체지향 언어에서는 public, pritvate등의 키워드로 해당 정보를 외부로 노출시킬지 여부를 결정할 수 있다.
하지만 자바스크립트에서는 이러한 키워드 자체를 지원하지않으므로 클로저
를 이용해야 한다.
클로저를 이용한 캡슐화
var Blog = function(arg) {
var name = arg ? arg : 'oppa';
return {
getName : function() {
return name;
},
setName : function(arg) {
name = arg;
}
};
} // 모듈 패턴
var blog = Blog(); /* or new Blog(); */
console.log(blog.name); // undefined
console.log(blog.getName()); // 'oppa'
naem 변수는 자유변수가되고 반환된 객체의 메서드들이 클로저 역할을 하면서 마치 name 변수가 private 멤버가 되었다.
이것이 자바스크립트에서 할 수 있는 가장 기본적인 정보 은닉 방법이다.
- 단점
사용자가 반환받은 객체는 Blog 함수 객체의 프로토타입에 접근할 수 없다는 단점이있다.
이는 Blog를 부모로하는 프로토타입을 이용한 상속을 구현하기가 어렵다는 것을 의미한다.
이를 보완하려면 객체를 반환하는것이 아닌, 함수를 반환하는것이 좋다.
var Blog = (function(arg) {
var name = arg ? arg : 'oppa';
var F = function() {}
F.prototype = {
getName : function() {
return name;
},
setName : function(arg) {
name = arg;
}
};
return F;
})();
var blog = new Blog();
console.log(blog.getName()); // 'oppa'
위 코드는 클로저를 활용하여 name에 접근할 수 없게 했다.
즉시 실행 함수에서 반환되는 F가 클로저가 되고 이 함수가 참조하는 name변수가 자유변수가 된다.
따라서 name 변수에대한 직접 접근이 불가능하다.
by 소년코딩
추천은 글쓴이에게 큰 도움이 됩니다.
악플보다 무서운 무플, 댓글은 블로그 운영에 큰 힘이됩니다.