useMemo
와 useCallback
은 둘다 React에서 memorization을 위해 사용된다이 블로깅에서 말하고 싶은건 useMemo
와 useCallback
의 사용법이나 사용해야될 때를 말하고 싶은 것이 아니라서 여기서 자세한 설명은 하지 않는다.
useMemo
와 useCallback
의 유일한 차이점은 다음과 같다.useMemo
는 결과값을 캐싱한다.useCallback
은 함수 자체를 캐싱한다.useMemo
를 사용해서 결과값을 함수로 리턴해서 함수를 기억하게 하면 useCallback
과 같은거 아닐까그럼 다음과 같은 순서로 해보면 궁금증을 해결할 수 있을것 같다.
useMemo
를 사용한다.useMemo
는 결과 값을 리턴하니까 값 대신 함수를 리턴한다. (커링 함수)console.log
를 사용해서 정말 캐싱되었는지 살펴본다.이제 궁금증을 해결해보자
import { useMemo, useCallback, useState } from "react";
import "./styles.css";
export default function App() {
const [count, setCount] = useState(0);
// useMemo로 memorization한 add 함수
const sumMemo = useMemo(() => {
console.log("sumMemo");
return (a, b) => {
return a + b;
};
}, []);
console.log(sumMemo(1, 2));
// useCallback으로 memorization한 add 함수
const sumCallback = useCallback((a, b) => {
return a + b;
}, []);
console.log(sumCallback(2, 3));
return (
<div className="App">
<h1>{count}</h1>
<button onClick={() => setCount((prev) => prev + 1)}>버튼</button>
</div>
);
}
console.log("sumMemo")
가 찍히지 않고, 매개변수에 인자도 잘 전달된다.결론 부터 말하면 Syntax Sugar라고 할 수 없다.
여기에 대해서는 필자는 맞다고 주장을 했었지만 서칭을 하다보니 아니라고 한다.
useCallback
은 memorization된 콜백 함수를 반환한다.useMemo
는 memorization된 값을 반환한다.useMemo
를 useCallback
처럼 사용할 수 있더라도 두 훅이 서로 대체 가능하다는 것을 의미하지 않는다.useCallback
은 useMemo
로 구현 가능해도 useMemo
는 useCallback
으로 구현 이 불가능해서 이다.