getter, setter는 캡슐화를 위해 쓰인다. 캡슐화란 정보를 캡슐안에 저장하여 외부 데이터를 외부로부터 보호하는 것을 말한다. getter,setter는 이런 목적을 위해 객체 안 함수(메소드)를 대신하는 기능이다.
객체를 일반적인 방식으로 변경할 수도 있지만, 변경시 입력된 값을 어떠한 기능을 거쳐 변경이 가능하게 한다.
즉, 데이터를 외부의 접근으로부터 '보호하기 위한' 목적으로 사용된다.
getter : 프로퍼티에 접근한다. ==> return이 필수적
setter : 프로퍼티를 직접 수정한다. ==> ()파라미터가 있어야 한다.
다음 예시를 보자.
const Person = {
age :20,
set newAge(age){
if(typeof age !== 'number'){
console.log('error');
} else {
this.age = age;
console.log('change success')
}},
get newAge(){ //getter뒤에 () 필수
return this.age;
}
}
Person의 age는 20으로 할당되어 있고, 나는 이 값을 재할당 하고 싶다. 하지만 일반적으로 재할당하면 숫자가 아닌 값을 입력해도 그대로 재할당된다.이를 막기위해서 숫자가 아닌 값으로 재할당하면 'error'를 띄우고, 숫자로 잘 재할당했으면 'change success'라는 문구를 띄워주는 newAge를 setter함수로 정의하였다.
Person.newAge = '40';
console.log(Person.age);
위와 같이 숫자가 아닌값으로 재할당했더니 'error'가 뜨고 age가 원래값인 20으로 뜨는 것을 볼 수 있다.
Person.newAge = 30;
console.log(Person.age);
하지만 숫자인 30으로 할당하니 change success가 뜨면서 변경된 값으로 age가 바뀌었다.
getter,setter쓸때 주의할 점
getter와 setter는 메소드(함수)이다. 그러나 사용시 일반함수처럼 이름 뒤에 ()를 사용하면 안된다.
예를 들어 위예제에서, 다음과 같이 쓰면 에러가 난다.
//getter사용시
console.log(Person.newAge());
//()를 적으면 안된다.
//setter사용시
Person.newAge(20);
//()안에 매개변수를 사용하면 안된다.
//다음과 같이 쓴다.
Person.newAge = 20;
그 외 예제...
const data = {
odd : [],
even : [],
///num을 짝수시 even,홀수시 odd에 넣어준다.
set Div(num){
if(num % 2 === 0 ){
this.even.push(num);
}else{
this.odd.push(num);
};
},
//odd,even을 한 배열에 묶어 오름차순으로 정렬한 값을
//보여준다.
get Show(){
const answer = [...this.odd,...this.even];
return answer.sort((a,b)=>a-b);
}
}
클래스 사용 예제
class Unit{
//기본 공격력과 체력이다
constructor(){
this.공격력 = 5;
this.체력 = 100;
}
//battlePoint시 공격력과 체력 합한 점수를 반환
get battlePoint(){
return this.공격력 + this.체력;
}
//heal을 사용하면 체력이 50 올라간다.
set heal(체력){
체력 += 50;
console.log(체력);
}
}