본문 바로가기
Programming/JavaScript

자바스크립트의 private 멤버

by ★용호★ 2016. 4. 24.

자바스크립트의 Private 멤버들은 생성자를 통해서 만들어진다. 생성자 안에서 var를 통해 생성된 변수들과 생성자의 파라미터들이 private 멤버가 된다.



위 코드에서의 생성자는 param, secret, that 이렇게 세개의 private 변수가 오브젝트에 추가되고, 외부에서는 접근할 수 없다. 또한 오브젝트가 소유한 public method 일지라도 접근할 수가 없고, private method를 통해서만 접근할 수 있다. private method는 생성자의 내부 function을 의미한다.



위 코드에서 private method인 dec는 secret 인스턴스 변수를 사용한다.


관례적으로 private 변수인 that을 만들기도 한다. 이는 ECMAScript Language 스펙의 내부 함수들 내에서 this에 부정확한 값을 set하게 하지 않도록 하는 하나의 해결책이다.


private method는 public method로부터 호출될 수가 없는데 이를 가능하게 만드는 privileged method가 있다.


privileged method는 private 변수와 메서드에 접근이 가능하고 privileged method 자신은 public 메서드와 외부에서 접근이 가능하다.



위 코드에서 service가 privileged method이다. myContainer.service() 를 호출하면 세번은 ‘abc’가 반환 될 것이다. 그 후에는 null이 반환된다. service에서는 private 변수인 secret에 접근하는 dec 메서드를 호출한다. service는 다른 객체나 메서드들에서 접근 가능하지만 직접적으로 private 멤버들에는 접근할 수 없다.


이런 public, private, privileged 멤버와 같은 패턴이 가능한 이유는 자바스크립트의 클로저 때문이다. 클로저는 외부 함수의 변수에 접근할 수 있는 내부 함수를 의미한다. 내부 함수를 포함하고 있는 외부 함수가 반환 되더라도 언제나 외부 함수의 변수와 파라미터에 접근 가능해야 한다. 이는 자바스크립트의 가장 강력한 기능 중 하나이다.


private와 privileged 멤버들은 오로지 객체가 생성될 때에만 만들 수 있다. 반면 public 멤버들은 언제든지 추가될 수 있다.


참고 : 더글라스의 Private Members in Javascript


댓글