본문 바로가기

자바스크립트/객체

자바스크립트 함수 내부의 변수는 private이다? private 구현하는 법

아래의 함수에 접근하는 방법은

 

function func() {

    var value = 'private';

}

 

func()로 호출하는 방법 뿐이다.

new 연산자를 붙여 객체를 생성할 수도 있다.

 

const obj = new func();

 

그러나 내부의 value에는 접근할 수 없다.

func()로 호출하면 내부 컨텍스트에서만 실행되고 말 뿐이고

new func()로 obj에 객체로 담는다고 해도

func() 실행시 value는 'private' 값을 담고 더 이상 쓰이지 못하기 때문에

바로 가비지 컬렉터로 간다? (이거는 확신하지 못하겠다.)

다만 value를 클로저에서 가져다 쓴다면 남겨둘 수 있다.

(클로저란 이미 생명 주기가 끝난 외부 함수의 변수를 참조하는 함수다.)

 

때문에 함수 내부의 변수는 private이라고 할 수 있다.

클로저로만 접근할 수 있다.

참고로 자바에서는 변수 선언할 때 앞에 private을 붙여주면 외부 컨텍스트에서 참조할 수 없게 된다.

자바스크립트는 다른 언어의 private을 이런식으로 구현할 수 있는 것이다.

 

반대로 함수 내부의 변수를 접근할 수 있도록 만들어 주려면 this를 사용해야 한다.

다시 말해 new func()를 호출해서 만든 객체의 변수에 접근하려면 this를 사용해야 한다.

 

new는 빈객체를 만들고 this가 이 객체를 가리키게 되고

func() {  }에 별다른 return이 없으면

기본적으로 this를 리턴하게 된다.

 

따라서 func() {  } 내부에 this.value = 'public'이 있을 경우

const obj = new func()를 호출 했을 때 

반환된 this를 obj가 가리키기 때문에

obj.value로 func() {  } 내부의 변수를 참조할 수 있는 것이다.

정확히 따지자면 복제된 인스턴스이지만...