UI/React
[ React / 데이터] 메모리 관점으로 JavaScript와 React는 어떻게 다른가?
Soo_Parkle
2024. 11. 28. 08:55
메모리 관점에서 React를 고려해 보면
리엑트는 메모리 주소를 참조하고 있다. 따라서 메모리 주소가 변경되어야만 Rendering을 시도한다.
JavaScript | React | |
메모리 관점 | 직접적인 메모리 조작, 단일 참조 | 불변성 기반 새로운 메모리 할당, 여러 버전의 상태 유지 |
상태 보존 | 단일 상태만 유지 | 이전 상태의 히스토리 관리 가능(시간 여행을 통한 디버깅) |
메모리 사용량 | 효율적인 메모리 사용 bc 직접 수정 | 약간 더 많은 메모리 사용 bc 새로운 객체 생성하기 때문 |
가비지 컬렉션 | let obj = { value : 123} obj = null 즉시 대상 |
const [ obj, setObj ] = useState({value : 123}); setObb(null) 내구적으로 관리하며 적절한 시점에 GC 처리 |
1. 데이터 처리
javaScript : 값이 스택 메모리에 직접 저장
React : 값은 스택 메모리에 저장되지만, React 의 내부 상태 관리 시스템에도 저장됨
// JavaScript
let arr = [1, 2, 3]
arr.push(4)
=> 직접 수정 가능
메모리 주소 : #123 : [1,2,3]arr -> #123
const [ arr, setArr ] = useState([1, 2, 3]);
setArr([...arr, 4])
=> 새로운 배열 생성 필요(새로운 새로운 참조 값이 필요)
메모리 주소 #123 ; [1, 2, 3] // 원본 배열
메모리 주소 #456 : [1, 2, 3, 4] // 새로운 배열arr -> #456
2. 객체 수정
// JavaScript
const user = { name: "John" };
user.age = 25;
=> 같은 메모리 주소에서 수정
// JavaScript
const data = {
user: {
profile: { name: "John" }
}
};
data.user.profile.age = 25;
=> 직접 수정
3. 중첩된 데이터
// React
const [user, setUser] = useState({ name: "John" });
setUser({ ...user, age: 25 });
=> 새로운 메모리 주소에 생성
// React
const [data, setData] = useState({
user: {
profile: { name: "John" }
}
});
setData({
...data,
user: {
...data.user,
profile: {
...data.user.profile,
age: 25
}
}
});
=> 새로운 객체 트리 생성