시작하기 전에..

자판기 커피가 있다고 가정하자,

자판기를 클래스라 하고 커피의 갯수를 variable, 커피를 뽑는것을 method라고 생각하자

그럼 자판기에서 커피를 뽑는데 커피의 갯수가 -1개가 되는게 맞을까? 아니다 무조건 0부터 시작해야 한다.

그렇기 때문에 이를 방지하고자 getter, setter 가 존재하고, -1을 선택해도 0으로 만들어 주기위해 setter가 있는것이다.

그럼 다른 사람이 커피의 갯수를 수정할 수 있으면 좋을까 안좋을까? 아니다 사용자는 접근하면 안된다.

그렇기 때문에 이 커피의 갯수를 private 으로 만드는 것이다.

→ 이 모두가 '캡슐화' 이다.

class User {
    constructor(firstName, lastName, age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age; 
				// this.age 는 계속 get age()를 호출하고, age는 계속 set age()를 호출한다.
				// -> stack trace 발생
        // 그렇기 때문에 get, set 에서 this.age 를 this._age라는 다른 변수로 지정해 준다.
    }

    get age() {
        return this._age;
    }

    set age(value) {
        // if (value < 0) {
        //   throw Error('age can not be negative');
        // }
        // 방법1

        this._age = value < 0 ? 0 : value; // 방법2
        // 설명과정2 : 그렇기 때문에 setter 에서 잘못된 변수값 접근을 막아준다.
    }
}

const user1 = new User('Steve', 'Job', -1); // 설명과정1 : 사용자의 나이가 -1 은 잘못된 값이다.
console.log(user1.age); // 0