둘 다 캐시하지만, 저장하는 대상이 다르다

useCallback은 함수 참조를, useMemo는 계산 결과를 재사용한다. 의존성이 바뀌면 둘 다 새 값을 만든다.

fn

useCallback(fn, deps)

함수를 호출하지 않고 참조를 보존한다. memo 자식에 넘기는 콜백이나 다른 Hook의 의존성에 유용하다.

=

useMemo(calc, deps)

순수 계산 함수를 실행해 결과를 보존한다. 측정된 고비용 계산이나 안정된 객체·배열 참조에 유용하다.

1 컴포넌트 렌더Hook 호출 순서는 항상 같다.
2 의존성 비교각 항목을 Object.is로 비교한다.
3 모두 동일이전 함수 참조 또는 계산 결과를 재사용한다.
4 하나라도 변경현재 함수 참조를 저장하거나 계산을 다시 실행한다.
의존성 누락오래된 값을 캡처한 stale closure가 생긴다.
memo인데 재렌더다른 prop·state·context 변경도 확인한다.
개발 중 계산 2회Strict Mode가 순수성 검사를 위해 한 결과를 버릴 수 있다.
최적화 근거 없음싼 계산에는 비교·캐시 비용만 늘 수 있다.

핵심: 메모이제이션은 정확성 보장이 아닌 성능 최적화다. 의존성을 완전하게 쓰고 Profiler로 효과를 확인한다.