★ 일반 프로퍼티에서 값에 접근하는 것처럼 ★ 평범하게 getter setter 을 사용한다.
getter 메소드는 object.fullName 을 사용해 읽으려고 할 때 사용된다.
setter 메소드는 object.age(value)를 사용해 수정하려 할 때 사용된다.
getter 메소드를 사용하면 함수처럼 호출 하지 않고,
★ 일반 프로퍼티에서 값에 접근하는 것처럼 ★ 평범하게 user.fullName을 사용해
프로퍼티 값을 얻을 수 있습니다.
getter age ( ) 를 정의하는 순간
this.age = age 를 참조하는 것이 아니라
바로 get age( )를 호출한다.
setter age ( value )를 정의하는 순간
바로 set age( value )를 호출한다.
그 말은 전달된 value 를 this.age에 할당 할 때 메모리의 값을 업데이트 하는 것이 아니라,
바로 setter 메소드를 호출하게 된다.
그 말은 메모리에 값을 전달 하는 것 이 아니라 setter 을 호출 하는 것.
class 내에 getter 와 setter 가 specifically define 되어있다면,
그 define 되어있는 property 에 한해서 accessor로 작용합니다.
그래서 위에 예제에서 age 에 대한 getter / setter 가 정확하게 define이 되어있기 때문에,
이제 저 "User" object에서의 age를 access 하려고하면
자동으로 JS가 getter / setter를 call 합니다.
그래서 this.age = age; 에서 'this.age =' 는 set age(value)를 call 합니다.
그러면 이제 여기 set age()을 보시면
set age(value){
this.age = value;
}
set age가 처음에 호출되고 function body를 execute할때,
this.age = value; 여기서 "this.age = " 는 다시 set age(value)를 호출하고,
다시 호출된 set age 에서 "this.age = "는 또 다시 set age(value)를 호출하고..
infinite recursion이 되서 callstack overflow 에러가 발생하죠.
그래서 나온 방법이 private property convention을 이용해서
getter 와 setter 안에 따로 age를 다른 이름으로 사용하자고 해서 _age로 define해줍니다.
set age(value){
this._age = value;
}
그러면 이제 다시 constructor 로 돌아가서, this.age = age; 이 실행될때
"this.age = "는 set age()를 호출하고,
set age()의 body에서보면
실제로는 age가 아니라
_age 라는 또 다른 이름의 변수에 저장합니다.
여기서 _age는 setter 가 define되어있지 않기 때문에 바로 메모리에 _age의 값을 저장합니다.
실제로는 _age라는 변수가 저장된 것이기 때문에,
User object에서 age가 아닌 _age도 직접 access해보면 age랑 같은 값인 것을 볼 수 있습니다.
const user1 = new User('Java', 'Script', 10);
console.log(user1.age);
console.log(user1._age);
하면 둘다 같은 10이 나옵니다.
실제로는 age가 아니라 _age에 저장되었는데 왜 user.age 도 10이 나오냐?
위에서도 설명했듯이 자동으로 getter를 호출하기때문에
getter에서 우리가 _age 값을 return하기로 정의를 바꾸어 주었기때문에
user1.age 도 10을 리턴하는 것입니다.
깊은 레벨에 들어가서 메모리 레벨을 보게되면,
age 는 실제로 undefined이고 _age 가 -1입니다.
참고 www.youtube.com/watch?v=_DLhUBWsRtw&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=6
'JavaScript' 카테고리의 다른 글
API (0) | 2021.05.02 |
---|---|
Synchronous(동기),Asynchronous(비동기),hosting (0) | 2021.04.26 |
객체를 리턴하는 방법 (0) | 2021.04.16 |
가비지 컬렉션 (0) | 2021.04.14 |
Map (0) | 2021.04.13 |