-
[JAVASCRIPT-모던자바스크립트] 참조에 의한 객체 복사2 / 가비지 컬랙션Javascript& React study 2021. 10. 14. 05:00728x90반응형SMALL
지금까진 user의 모든 프로퍼티가 원시값인 경우만 가정했으나 프로퍼티는 다른 객체에 대한 참조 값일 수도 있다. 이러한 경우에는 아래와 같이 진행될 것이다.
let user = { name : "John", sizes: { height: 182, width: 50 } }; alert( user.sizes.height ); // 182
- clone.sizes = user.sizes로 프로퍼티를 복사하는 것만으로는 객체를 복제할 수 없다.
- user.sized는 객체이기 때문에 참조값이 복사되기 때문이다.
- clone.sizes = user.sizes로 프로퍼티를 복사하면 clone과 user는 같은 sizes를 공유하게 된다.
let user = { name : "John", sizes: { height: 182, width: 50 } }; let clone = Object.assign({}, user); alert( user.sizes === clone.sizes ); // true, 같은 객체이다. // user와 clone은 sizes를 공유한다. user.sizes.width++; // 한 객체에서 프로퍼티를 변경한다. alert(clone.sizes.width); // 51, 다른 객체에서 변경 사항을 확인할 수 있다. alert(user.sizes.width); // 51
이 문제를 해결하기 위해서는 user[key]의 각 값을 검사하면서, 그 값이 객체인 경우 객체의 구조도 복사해주는 반복문을 사용해야 한다. 이것을 '깊은 복사 (deep cloning)'라고 한다.
깊은 복사 시 사용되는 표준 알고리즘인 Structured cloning algorithm을 사용하면 위 사례를 비롯하여 다양한 상황에서 객체를 복사할 수 있다.
자바스크립트 라이브러리 lodash메서드인 .cloneDeep(obj)을 사용하면 이 알고리즘을 구현하지 않고도 깊은 복사를 처리할 수 있다.
가비지 컬렉션
자바스크립트는 눈에 보이지 않는 곳에서 메모리 관리를 수행한다.
원시값, 객체, 함수 등 우리가 만드는 것들은 모두 메모리를 차지합니다. 그렇지만 더 쓸모 없어지게 되는 것들은 어떻게 처리가 되는 것일까? 그래서 자바스크립트에서 엔진이 어떻게 필요 없는 것을 찾아내 삭제하는지 알아보자.
가비지 컬렉션 기준
자바스크립트는 도달 가능성(reachability)이라는 개념을 사용해 메모리 관리를 수행 '도달 가능한(reachable)' 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미 도달 가능한 값은 메모리에서 삭제되지 않는다.
아래는 태생부터 도달되기 때문에 명백한 이유 없이는 삭제되지 않는다. (root)
- 현재 함수의 지역 변수와 매개변수
- 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
- 전역 변수
- 기타 등등루트가 참조하는 값이나. 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됩니다.
전역 변수에 객체가 저장되어있다고 가정하면 이 객체에 프로퍼티가 또 다른 객체를 참조하고 있다고 한다면 프로퍼티가 참조하는 객체는 도달 가능한 값이 된다. 이 객체가 참조하는 다른 모든 것들도 도달 가능하다고 여겨진다.
자바스크립트 엔진 내애서는 가비지 컬렉터(gabage collecter)가 끊임없이 동작한다. 가비지 컬렉터는 모든 객체를 모니터링하면서 도달할 수 없는 객체는 삭제한다.
// user에는 객체 참조 값이 저장됨 let user = { name : "John" };
전역 변수 : "user" -> {name : "John"} 이라는 객체를 참조한다. 'name'은 원시값을 저장하고 있기 때문에 객체 안에 표현
user의 값을 다른 값으로 덮어쓰면 참조(화살표)가 사라진다.
user = null;
이제 John은 도달할 수 없는 상태가 되었다. John에 접근할 방법도 John을 참조하는 것도 모두 사라졌다. 이렇게 된다면 가비지 컬렉터는 John에 저장된 데이터를 삭제하면서 John을 메모리에서 삭제한다.
728x90반응형LIST'Javascript& React study' 카테고리의 다른 글
[JAVASCRIPT-모던자바스크립트] 메서드와 this (3) 2021.10.20 [JAVASCRIPT-모던자바스크립트] 가비지 컬랙션2 (0) 2021.10.15 [JAVASCRIPT-모던자바스크립트] 참조에 의한 객체 복사 (1) 2021.10.10 [JAVASCRIPT-모던자바스크립트] 객체 기본에 대해서 알아보자3 (0) 2021.10.09 [JAVASCRIPT-모던자바스크립트] 객체 기본에 대해서 알아보자2 (1) 2021.10.08