본문 바로가기

심층 자바스크립트(2) -왜 캡슐화가 필요할까?-

by Recstasy 2019. 6. 8.

캡슐화란 이름 그대로 뭔가 보호한다는 의미다. 객체를 생성할 때, 외부에서 프로퍼티에 접근할 수 있도록 설정하면서 동시에 특정 프로퍼티에는 접근할 수 없도록 하고 싶다면  캡슐화를 이용하면 된다. 가령, 'car'라는 객체를 만들었다고 가정해보자.


let car = {

     gear : '8단',

     power : '320마력',

     seat : 'black'

}



위의 코드에서는 외부에서 객체 내부의 값에 접근할 수 있다. 만일, car라는 객체에서 seat 프로퍼티는 외부에서 접근할 수 있지만, gear와 power는 숨기고 싶다면 어떻게 해야할까? 


위의 상태에서는 car.gear = '9단'이라고 입력하는 순간 car객체의 gear값이 변경된다. 프로그램을 제작하다보면 변경이 불가능한 값에 대한 설정이 필요하다.  가령, 사용자들에게 메서드만 알려주고, 내부에는 고정된 값이 필요하다면 캡슐화가 필수다.  

캡슐화에서는 아래 2가지 사항이 필요하다.


1] 내부에 지역변수를 선언한다.

2] 즉시 실행 함수 패턴을 사용한다.


 

즉시실행함수를 활용한 캡슐화를 진행해보자.


let car = (function(){

    let _gear = '8단';  //지역변수 선언

    return {

        get_gear(){

          console.log('call getter');

          return _gear;

      },

      set_gear(value){

         console.log('call setter');

         _gear = value;

      }

   }

}())


console.log(car._gear);

//>> undefined    ---> ①


car.set_gear('9단');

console.log(car.get_gear())

//>>call getter     ---> ②


console.log(car._gear);

//>>undefined     ---> ③


console.log(car.gear());

//>>9단    ---> ④



①의 경우 즉시실행함수에서는 car객체에서 곧바로 _gear, 지역변수에 접근할 수 없다. return값으로 지정해준 public영역의 메서드에만 외부에서 접근가능하다.  의 경우, set_gear()메서드를 통해 '9단'이라는 값을 입력했다. set_gear메서드는 내부 지역변수 _gear의 값을 인자값, value로 변경한다. 


은 당연히 외부에서 접근불가능하다.  ④의 경우, public(return내부)의 get_gear()메서드가 내부 _gear값을 반환하기 때문에 변경된 9단 값이 도출된다.

댓글

최신글 전체

이미지
제목
글쓴이
등록일