소년코딩

캡슐화란 기본적으로 관련된 여러가지 정보(프로퍼티, 메서드)를 하나의 틀에 담는 것을 의미한다.

캡슐화에서 중요한 것은 정보의 공개 여부인데 자바와 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 소년코딩

추천은 글쓴이에게 큰 도움이 됩니다.

악플보다 무서운 무플, 댓글은 블로그 운영에 큰 힘이됩니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기