"생성(create)"함수와 그것의 의존성 값의 배열을 전달한다. useMemo
는 의존성이 변경되었을 때에만 메모이제이션된 값만 다시 계산한다. 이 최적화는 모든 렌더링시 고비용 계산을 방지하게 해준다.
메모이제이션(memoization)
이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술
- 참조: 위키피디아
함수형 컴포넌트의 렌더링은 component 함수를 호출하고 모든 내부 변수 초기화의 순서를 갖는다.
function add(){
return 348696234 * 573248522;
}
function Component(){
// value 변수는 렌더링 떄마다 초기화하여 add()를 매번 호출한다.
const value = add()
}
export defalut Component;
만약 내부 변수에 복잡한 일을 처리하는 함수가 할당 되어 있다면 렌더링 할 때마다 이 일을 반복해야 하니 비효율 적이므로 이때 useMemo를 사용한다.
const value = useMemo(()=> {
return add();
},[의존성])
import { useMemo, useState } from "react";
const hardCalculate = (number) => {
console.log("어려운 계산");
for (let i = 0; i < 9999999999; i++) {}
return number + 10000;
};
const easyCalculate = (number) => {
console.log("쉬운 계산");
return number + 1;
};
export default function App() {
const [hardNumber, setHardNumber] = useState(1);
const [easyNumber, setEasyNumber] = useState(1);
const hardSum = useMemo(()=> {
return hardCalculate(hardNumber)
}, [hardNumber]);
const easySum = easyCalculate(easyNumber);
return (
<div className="App">
<h3>어려운 계산기</h3>
<input
type="number"
value={hardNumber}
onChange={(e) => setHardNumber(parseInt(e.target.value))}
/>
<span> + 10000 = {hardSum}</span>
<h3>쉬운 계산기</h3>
<input
type="number"
value={easyNumber}
onChange={(e) => setEasyNumber(parseInt(e.target.value))}
/>
<span> + 1 = {easySum}</span>
</div>
);
}
object의 경우 객체타입으로 일반 원시 타입과는 다르게 값이 저장될 때 메모리 상의 주소가 다르게 저장된다. 그렇게 떄문에 값이 변경되지 않았어도 메모리 주소가 렌더링 때마다 변경된다.
너무 많이 사용할 경우 값을 재활용하기 위해 메모리를 소비해서 저장하기 떄문에 불필요한 값까지 다 저장하면 메모리 소비가 커진다.
❗️useMemo는 성능을 최적화하기 위해 사용하긴 하지만 보장되어 있는것이 아니다. React는 차 후에 이전 메모이제이션된 값들의 일부를 지우고 다음 렌더링 시에 재계산하는 방향을 채택할 수도 있다고 한다.