# Information Hiding

자바스크립트에는 은닉된 프로퍼티라는 개념이 없다. 자바에는 private, protected, public과 같은 접근제어자가 있어서 외부에서 인스턴스 멤버에 접근하는 것을 통제할 수 있지만, 자바스크립트는 클래스의 모든 프로퍼티가 public이다.

종종 프로퍼티 이름 앞에 언더스코어를 붙이는 방식(`this._name`)으로 private한 변수임을 표현하는 경우도 있는데, 실제로 프로퍼티가 private하게 동작하는 것은 아니기 때문에 오해를 불러일으킨다는 의견이 있다. [Airbnb JavaScript 스타일 가이드](https://github.com/ParkSB/javascript-style-guide#naming--leading-underscore)를 참고.

프로퍼티 대신 변수를 사용하면 정보를 은닉하는 효과를 낼 수 있다.

```javascript
// Animal.js
class Food{
    constructor(name) {
        let name = name;

        this.getName = () => { 
            return name;
        };

        this.setName = (newName) => {
            name = newName;
        }
    }
}

export default Food;
```

변수는 해당 블록 안에만 존재하기 때문에 해당 블록을 벗어나서 접근하면 undefined가 된다. (단, 블록 스코프를 갖는 `let`, `const`와 달리 `var`는 함수 스코프를 갖는다.) 따라서 constructor 안에 변수를 선언하면 외부에서 `name`에 직접 접근할 수 없다. 더불어 `name`을 가져오는 프로퍼티와 `name`을 설정하는 프로퍼티를 두면 외부에서 `getName`과 `setName`을 통해 `name`에 간접적으로 접근할 수 있다.
