{
type CoffeeCup = {
shots: number;
hasMilk: boolean;
};
*// public
// private
// protected*
class CoffeeMaker {
private static BEANS_GRANS_PER_SHOT = 7; *// private*
private coffeeBeans: number = 0; *// private*
private time: number = 0; *// private*
*// getter -> 함수가 아니다.*
get timer(): number {
return this.time;
}
*// setter -> 함수가 아니다.*
set timer(num: number) {
this.time = num;
}
// ----------
private constructor(coffeeBeans: number) { *// private*
this.coffeeBeans = coffeeBeans;
}
// #1: private constructor
static makeMachine(coffeeBeans: number) { *// public*
return new CoffeeMaker(coffeeBeans);
}
// #1: return new className();
// -> 이처럼 함수(메소드)를 통해서 객체 생성이 되어있는 경우라면
// 생성자 생성 이용을 못하도록 막하놓는 경우 사용하는 방법이다.
// 그래서 생성자에 private 을 붙여서 밖에서 객체 생성을 통한 생성자 접근을 막고
// 클래스 내부 함수(메소드)를 통해 객체 생성을 통한 생성자 접근을 가능하게 만들어 놓는다.
// ----------
public fillCoffeeBeans(beans: number) { *// public*
if (beans < 0) {
throw new Error('beans not enoughf');
}
this.coffeeBeans += beans;
}
public makeCoffee(shots: number): CoffeeCup { *// public*
if (this.coffeeBeans < shots * CoffeeMaker.BEANS_GRANS_PER_SHOT) {
throw new Error('Not enough coffee beans!');
}
this.coffeeBeans -= shots * CoffeeMaker.BEANS_GRANS_PER_SHOT;
return {
shots: shots,
hasMilk: false,
}
}
}
const maker = new CoffeeMaker(34);
maker.fillCoffeeBeans(32);
console.log(maker);
maker.timer = 10; *// setter*
console.log(maker.timer); *// getter(readonly)*
}
[ 캡슐화 - encapsulation ]
클래스 내에 멤버변수와 메소드를 외부의 접근여부를 지정해주는 방식으로,
외부에서 접근 가능한 건 무엇인지, 내부에서만 접근해야 하는 건 무엇인지 정의할 수 있다.
(접근제어자 사용)
캡슐화 하기 -1
클래스 내부와 외부에서 모두 접근이 가능하다면 (생략가능) - public
클래스 내부에서만 접근이 가능하고, 클래스 외부에서는 접근할 수 없도록 한다면 - private
클래스 내부와 상속받은 클래스 내부에서만 접근이 가능하고, 클래스 외부에서는 접근할 수 없도록 하면 → protected
캡슐화 하기 -2
자바나 C++에서는 getter, setter 를 함수로 선언하여 사용하지만,
JavaScript(ES6) 에서는 get, set 을 따로 변수의 종류로 정의해 두었기 때문에 멤버변수 처럼 호출해서 사용 시 그냥 변수명 하나만 쓰면 getter(get) 이고, 변수명에 값을 할당 해 주면 setter(set) 를 간편하게 사용할 수 있다.
즉, 그냥 멤버 변수(프로퍼티-property) 하나만 쓰면 읽고 쓰기가 가능하다.
( getter(get) 는 읽기 전용 / setter(set) 는 쓰기 전용 )
추가로 get, set은 인터페이스나 추상클래스 등에 선언된 멤버변수를 좀 더 기능에 맞게 사용될 때 자식 클래스에서 get, set을 사용한다.
getter 와 setter 는 캡슐화의 특성 중 '정보 은닉' 의 성격이 잘 반영된 것이라 할 수 있다.
사용자는 그저 값을 입력하고 받아오지만 getter 와 setter 의 내부적으로 어떻게 처리되고 가공되어 입력되고 출력되는지 알 수 없기 때문이다.
유용한 특성
*constructor(private coffeeBeans: number, public cups: number) {
}*
따로 멤버변수를 선언할 필요 없이 생성자 매개변수에 private, public 등 접근지정자와 함께 선언해 주면 멤버변수처럼 할당이 가능하다. 즉, 멤버변수이자 매게변수(인자) 가 된다.