인프런 커뮤니티 질문&답변

조세진님의 프로필 이미지
조세진

작성한 질문수

모던 자바스크립트(javascript) 개발을 위한 ES6 강좌

WeakSet 으로 효과적으로 객체타입저장하기

ws.has(arr) 문의 입니다.

작성

·

142

4

arr = null을 했다고 하더라도,

가비지 컬렉터 입장에서 보면 ws에서 참조 중이기 때문에 가비지 컬렉견 대상으로는 되지 않을 것 같습니다.

가비지 컬렉션 대상으로 인식한다는 근거로 제시하신 것이

ws.has(arr) 인데, arr에 null값을 넣고 하였으니...

ws.has(null)이니 당연 false나오는 거 아닌가요?

답변바랍니다

답변 2

0

이게 이제 누군가가 arr = null 로 수정했어도 이미 ws 변수에서 arr를 참조하고 있으니까 그 자체만으로 가비지 컬렉션 대상이 안되고 유지되는거 아니냐 하시는 것 같은데 잘 보시면은 강사님 말씀처럼 WeakSet이 애초에 약한 참조를 하도록 만들어 졌어요. 만약 강한 참조를 하게 되면 arr = null을 해도 컬렉션 대상 안되거든요? 근데 약한 참조라서 null을 하게 되면 수집 대상이 되는 거라고 알고 있습니다. 그냥 강사님 말을 복붙한거져. 근데 왜?! 이런 거잖습니까? 거기에 대해서 말씀드리면은 메모리 때문에 그래요. JS개발하면 보통 메모리 신경 잘 안쓰는 사람 많은데 Weakset은 객체를 약한 참조로 저장하고 내부 데이터나 객체의 상태는 저장안해요. 감싸고 있는 객체 레퍼런스 주소만 저장하는거에요. 그리고 객체가 다른 곳에서 참조되지 않을 때 가비지 컬렉터가 스윽 보다가 해당되면 지워버리고 메모리 사용을 줄이는 컨셉인거죠. 이런 패턴, 약한 참조를 걸어두는 방식은 이벤트 리스너와 콜백 그리고 DOM 트리 구조에서 UI 업데이트할때도 쓰입니다. 이벤트 리스너가 WeakMap에 저장되면, 해당 객체가 더 이상 참조되지 않을 때 가비지 컬렉터에 의해 객체가 수집됩니다. 그리고 WeakMap에서 해당 객체와 연결된 이벤트 리스너도 자동으로 제거됩니다.

0

저도 이렇게 생각했네요.

조세진님의 프로필 이미지
조세진

작성한 질문수

질문하기