[번역] Private Members in JavaScript -Douglas Crockford linguistics

http://javascript.crockford.com/private.html

JavaScript 는 세상에서 가장 오해받는 언어이다. 일부에선, private (속성의;역자) instance 변수와 메소드의 부재로 인해, 객체의 '정보 은닉' 기능이 결여되어 있다고 믿기도 한다. 그러나 이것은 오해다. JavaScript 객체는 private 멤버를 가질 수 있다. 여기 해답이 있다.


Objects


JavaScript 는 근본적으로 거의 object 이다. Array type도 object 이고, Function type도 object 이며, Object type도 object 이다. 그럼 여기서 말하는 object 란 무엇인가? object 는 name-value 쌍의 집합이다. name 은 string 이고, value 는 string, number, boolean, 그리고 (array 와 function 을 포함한) object 이다. 마치 hashtable 처럼 구현되기 때문에 아주 빠르게 value 에 접근할 수 있다.

만약 value 가 function 이라면, 이것을 method 라고 볼 수 있다. object 의 한 메소드가 호출되면, 'this' 변수는 해당 object 가 되고, 이 메소드는 'this' 변수를 통해 instance 변수에 접근하게 된다.

object 는 '생성자'라는 함수에 의해 생성된다. 이 함수는 object 를 초기화한다. 이 '생성자'에서, 여타의 언어에서 제공되는 class 의 속성들-static 변수와 메소드를 포함한- 이 제공된다.


Public


object 의 멤버는 모두 public 멤버이다. 어떤 function 이든 이 멤버에 접근해서 수정하거나 지우거나 또는 새로운 멤버를 추가할 수 있다. 여기, 새로운 object 에 멤버를 추가하는 2가지 대표적인 방법이 있다.

In the constructor

이 기법은 보통 public (속성의;역자) instance 변수를 초기화하는데 사용된다. '생성자'에서 사용된 'this' 변수는 새로운 멤버를 추가하는데 사용된다.

function Container(param) {
    this.member = param;
}

다음과 같이 새로운 object 를 생성하면,

var myContainer = new Container('abc');
myContainer.member 는 'abc'라는 값을 갖는다.

In the prototype

이 기법은 보통 public 메소드를 추가하는데 사용된다. 사용된 멤버 변수가 객체내에 이미 존재하던 것이 아니면, 객체의 생성자의 prototype 멤버로부터 찾아오게 된다. 이 prototype 메커니즘은 상속 구현에 사용되며 또한, prototype 을 사용하면 메모리 사용도 줄일 수 있다. 하나의 '생성자'로부터 생성된 모든 object 에 하나의 메소드를 추가하고자 한다면, 그 function 을 '생성자'의 prototype 에 추가하면 된다.

Container.prototype.stamp = function(string) {
return this.member + string; 
};

이제 다음과 같이 해당 메소드를 호출할 수 있게 되었고,

myContainer.stamp('def');
이는 결과적으로 'abcdef' 라는 값을 산출한다.


Private


private 멤버는 생성자에서 만들 수 있다. 일반적으로 var 로 선언한 변수와 함수의 매개변수는 private 멤버이다.

function Container(param) {
    this.member = param;
    var secret = 3;
    var that = this;
}


이 생성자는 param, secret, that 이라는 3개의 private instance 변수를 생성한다. object의 멤버로 생성되었지만, 이 변수들은 외부에서도, public 메소드에서도 접근할 수 없다. 이것들은 private 메소드에서 접근 가능한데, private 메소드는 생성자 내부에서의 function 정의로 구현된다.

function Container(param) {
    function dec() {
        if (secret > 0) {
            secret += -1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;
}


private 메소드인 dec 는 instance 변수인 secret 을 검사해서, 0 보다 크면, 1 감소시키고 true 를 리턴한다. 그렇지 않다면, false 를 리턴한다. 이로인해 이 object 의 사용을  3회로 제한할 수 있게 되었다.

규정대로라면, 우리는 private 속성의 that 변수를 만들어서, object 가 private 메소드에서 가용하게 할 수 있는데, 이는 ECMAScript 스펙에 의해 inner fuction 에서 this 가 잘못 세팅되는 경우에 대한 차선책이다.

private 메소드는 public 메소드에서 호출될 수 없다. 보다 쓸만한 private 메소드 구현을 위해 이제 privileged 메소드를 알아봐야겠다.


Privileged


privileged 메소드는 private 변수와 메소드에 접근할 수 있으며, 또한, public 메소드와 외부에서 이 메소드를 사용할 수 있다. privileged 메소드를 삭제하거나 대체할 수 있는 반면, 수정하거나 secret 을 공개하게 할 수는 없다.

function Container(param) {
    function dec() {
        if (secret > 0) {
            secret += -1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;

    this.service = function() {
        if (dec()) {
            return that.member;
        } else {
            return null;
        }
    };
}


service 는 privileged 메소드이다. myContainer.service()를 호출하면 처음 3번은 'abc'를 리턴하고, 그후에는 null 을 리턴한다. service 는 private 인 dec 메소드를 호출하고 dec 는 private 변수인 secret 에 접근한다. service 는 타 object 와 메소드에서 사용할 수 있지만, private 멤버에의 직접적인 접근은 허용하지 않는다.


Closures


JavaScript 에서 이러한 public, private, privileged 멤버들의 구현이 가능한 것은, closure 때문이다. closure 의 의미는(Javascript의 closure 구현이 시사하는 바는), inner function 은 outer function 의 var 선언 변수와 매개변수에 접근할 수 있으며, 심지어 outer function 이 리턴된 이후에도 가능하다는 뜻이다. 이는 굉장히 강력한 언어 속성인데, JavaScript 에서 어떻게 이것이 가능한지 파헤쳐놓은 책은 아직은 없다. 대부분 아예 언급할 생각조차 없는 것 같다.

private 과 privileged 멤버는 object 가 생성될 때에만 만들 수 있다. 반면, public 멤버는 언제든 만들 수 있다.


Patterns


Public

function Constructor(...) {
    this.membername = value;
}
Constructor.prototype.membername = value;


Private

function Constructor(...) {
    var that = this;
    var membername = value;

    function membername(...) {...}
}


Note: function 구문

function membername(...) {...}



var membername = function(...) {...};
표현의 축약이다.


Privileged

function Constructor(...) {
    this.membername = function (...) {...};
}


(원문에) Copyright 2001 Douglas Crockford. All Rights Reserved Wrrrldwide.

핑백

덧글

  • 2008/10/28 18:00 # 답글 비공개

    비공개 덧글입니다.
  • 낭망백수 2008/10/31 15:28 #

    방명록이 없네요. ^^;
    역본에 저작권은 없습니다.
    원문링크랑 마지막 원문 저작표시만 꼭 넣어주시면 됩니다.
    감사합니다.
    꾸벅~!
  • 낭망백수 2008/10/31 15:32 #

    참, 이 본문과 함께...
    Javascript : The Definitive Guide 5/e 9장(특히 9.3절)을 보시는 것이 좋습니다.
    Priviledged 는 더글러스 크록포드가 처음 사용한 표현이지만
    JsDG 에는 범용 표현이 나옵니다.
    꾸벅~!
  • 톱아보다 2011/09/09 00:36 # 삭제 답글

    글 잘읽고 돌아갑니다. ^^
    헛갈리는 부분이 있었는데 명쾌해 지네요.
  • 행운운행 2011/11/22 12:12 # 삭제 답글

    상위에
    Object 항목의 마지막에
    변수와 메소드를 포함한- 이 제공된다.
    "- 이" keyword가 빠졌는데 무엇입니까?
  • 전선민 2011/12/21 21:50 # 삭제

    "A-B-" 표현은 B가 A를 수식하는 것입니다. '-B-'를 빼고 읽으시면 됩니다. ^^
  • generic_via_gra 2015/06/16 11:10 # 삭제 답글

    I just ought to tell you which you have written an exceptional and distinctive post that I really enjoyed reading. Im fascinated by how nicely you laid out your material and presented your views. Thank you.
  • cia_lis_price 2015/06/16 11:12 # 삭제 답글

    I just ought to tell you which you have written an exceptional and distinctive post that I really enjoyed reading. Im fascinated by how nicely you laid out your material and presented your views. Thank you.
  • via_gra_prices 2015/06/16 11:13 # 삭제 답글

    I just ought to tell you which you have written an exceptional and distinctive post that I really enjoyed reading. Im fascinated by how nicely you laid out your material and presented your views. Thank you.
  • generic_cia_lis 2015/06/17 09:15 # 삭제 답글

    Actually its referred to as Search engine optimization that when i search for this post I found this web page at the top of all web pages in search engine.
  • generic_via_gra 2015/06/17 09:16 # 삭제 답글

    Actually its referred to as Search engine optimization that when i search for this post I found this web page at the top of all web pages in search engine.
  • cia_lis_price 2015/06/17 09:18 # 삭제 답글

    Actually its referred to as Search engine optimization that when i search for this post I found this web page at the top of all web pages in search engine.
  • via_gra 2015/06/17 09:19 # 삭제 답글

    Actually its referred to as Search engine optimization that when i search for this post I found this web page at the top of all web pages in search engine.
  • cia_lis 2015/06/19 01:26 # 삭제 답글

    This kind of game gives a real experience of building a farm and planting
  • via_gra 2015/06/19 01:26 # 삭제 답글

    This kind of game gives a real experience of building a farm and planting
  • cia_lis 2015/06/19 01:27 # 삭제 답글

    This kind of game gives a real experience of building a farm and planting
  • cia_lis 2015/06/19 01:28 # 삭제 답글

    This kind of game gives a real experience of building a farm and planting
  • brand 2015/06/19 06:03 # 삭제 답글

    In fact when someone doesnt understand then its up to other visitors that they will help, so here it takes place.
  • via_gra 2015/06/19 06:03 # 삭제 답글

    In fact when someone doesnt understand then its up to other visitors that they will help, so here it takes place.
  • brand 2015/06/19 06:04 # 삭제 답글

    In fact when someone doesnt understand then its up to other visitors that they will help, so here it takes place.
  • via_gra 2015/06/19 06:04 # 삭제 답글

    In fact when someone doesnt understand then its up to other visitors that they will help, so here it takes place.
  • purchase_cia_lis 2015/06/19 12:19 # 삭제 답글

    I just like the helpful info you supply on your articles. I will bookmark your blog and take a look at once more here regularly. I'm somewhat sure Ill learn a lot of new stuff right right here! Best of luck for the following!
  • purchase_via_gra 2015/06/19 12:19 # 삭제 답글

    I just like the helpful info you supply on your articles. I will bookmark your blog and take a look at once more here regularly. I'm somewhat sure Ill learn a lot of new stuff right right here! Best of luck for the following!
  • side 2015/06/19 12:19 # 삭제 답글

    I just like the helpful info you supply on your articles. I will bookmark your blog and take a look at once more here regularly. I'm somewhat sure Ill learn a lot of new stuff right right here! Best of luck for the following!
  • side 2015/06/19 12:19 # 삭제 답글

    I just like the helpful info you supply on your articles. I will bookmark your blog and take a look at once more here regularly. I'm somewhat sure Ill learn a lot of new stuff right right here! Best of luck for the following!
  • site 2015/06/20 16:19 # 삭제 답글

    you use disallowed a designer to make the style? Superb vocation!
  • for 2015/06/20 16:19 # 삭제 답글

    you use disallowed a designer to make the style? Superb vocation!
  • cia_lis 2015/06/26 15:47 # 삭제 답글

    Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point. You obviously know what youre talking about, why throw away your intelligence on just posting videos to your site when you could be giving us something enlightening to read?
  • cia_lis 2015/06/27 05:33 # 삭제 답글

    Hey esto es un gran poste. Puedo utilizar una porcin en ella en mi sitio? Por supuesto ligara a su sitio as que la gente podra leer el artculo completo si ella quiso a. Agradece cualquier manera.
  • via_gra 2015/06/27 05:33 # 삭제 답글

    Hey esto es un gran poste. Puedo utilizar una porcin en ella en mi sitio? Por supuesto ligara a su sitio as que la gente podra leer el artculo completo si ella quiso a. Agradece cualquier manera.
  • canadian_via_gra 2015/06/27 05:33 # 삭제 답글

    Hey esto es un gran poste. Puedo utilizar una porcin en ella en mi sitio? Por supuesto ligara a su sitio as que la gente podra leer el artculo completo si ella quiso a. Agradece cualquier manera.
  • cia_lis_canada 2015/06/27 05:33 # 삭제 답글

    Hey esto es un gran poste. Puedo utilizar una porcin en ella en mi sitio? Por supuesto ligara a su sitio as que la gente podra leer el artculo completo si ella quiso a. Agradece cualquier manera.
댓글 입력 영역