[JS] Maximum call stack size exceeded 해결 | class getter setter 이해하기
Class setter, call stack 에러발생
자바스크립트에서 클래스를 만들 때 다음과 같이 만들었다고 해보자.
- name을 값으로 입력받는
class St
를 만들었다. - 입력받은 name을 setter로 넘겨 값을 업데이트해주려고 한다.
- call stack의 범위를 넘어선다는 에러가 발생했다.
무한재귀✨ 때문이다.
이 때 call stack에러는 무한재귀에 빠졌기 때문에 발생한다.
constructor()
내부의 this.name=name;
코드가 set name()
을 호출한다.
메모리에 name
을 바로 할당하여 업데이트하지 않고 setter를 호출 하는 것이다!
호출된 setter내부에서 this.name=name;
코드가 똑같이 존재하므로 또 다시 set name()
을 호출하는 무한재귀에 빠지게된다.
해결방법✨
이를 해결하기 위해 구글을 뒤져본 결과!
다들 _(underscore)를 적용하라고 한다.
- 아래와 같이 setter내부에
this._name=name;
로 수정했다. - 보다싶이 재귀에 빠지지 않게되었다.
- _를 붙이면 private 혹은 내부적인 속성이라고 명시하는 것이다.
- 다시말하면 기술적으로
hiny._name
접근이 가능하긴 하다.
- 자바스크립트의 Privacy 코드컨벤션 중 하나로, 접근이 가능하지만 외부에서 가져다 쓰지말자는 의미이다.
That's a very common theme in JS. Privacy by convention.
By prefixing the property with one or multiple underscores you signal that this is some private or internal property and not part of the public API for this class, and therefore consumers of these objects should stay away from these properties.
이게 왜... 되지..❓
이제는 호출된 setter내부에서 this._name=name;
코드에 의해 set name()이 다시 호출되지 않는다.
하지만 내가 저장한 this.name
을 얻으려고 입력하면,
undefined 라고 뜬다.
당연함. setter에서 _name
이라고 저장했음.
다시한번 강조하지만,
this.name=name;
코드에서 바로 메모리에 올리는 것이 아니다!
이 코드는 setter를 호출하고 값을 넘겨주는 역할을 한다!
그래서 이제 getter이 필요한거다.
이제 get name()을 싸악 끼워넣어주면?
class St{
constructor(name){
this.name=name;
}
get name(){
return this._name;
}
set name(value){
this._name=name;
}
}
this.name이라고 입력하면 원하는 이름을 얻어낼 수 있다.
즉, 실제 내부에는 _name
이라고 저장되어 있고 name
은 저장된 _name
에 접근하기 위한 키 역할을 하는 것이다.
📌결론!
this.name=name;
을 통해 setter를 호출, 값을 저장this.name;
으로 getter로 접근해서 저장된_name
을 싸악 꺼내주는 것이다.
틀린부분이 있으면 언제든 알려주세요........😂
Author And Source
이 문제에 관하여([JS] Maximum call stack size exceeded 해결 | class getter setter 이해하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@awesome-hong/JS-Maximum-call-stack-size-exceeded-해결-getter-setter-이해하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)