useMemo는 계산 결과를, useCallback은 함수 참조를 의존성 기준으로 재사용합니다. React.memo와 함께 쓰면 자식 렌더를 건너뛸 수도 있습니다.
데모는 무관한 부모 상태가 바뀔 때 반복 계산과 재사용 경로를 비교합니다. 메모이제이션은 비용이 있으므로 측정 없이 모든 곳에 넣지 마세요.
언제 쓰나
비싼 계산이나 안정적인 참조가 실제 병목일 때 프로파일링 후 적용합니다.
의존성이 같으면 계산값이나 함수 참조를 재사용해 불필요한 작업을 줄입니다.
<div class="scene"><div class="title">PARENT UPDATE <span id="turn">1</span></div><div class="row"><div class="label">raw compute</div><div class="cells" id="raw"></div></div><div class="row"><div class="label">memoized</div><div class="cells" id="memo"></div></div><div class="foot" id="foot">same dependencies → cached result</div></div>.scene{width:min(94vw,800px);height:min(86vh,320px);position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:clamp(9px,2.4vmin,20px);font:500 clamp(15px,4vmin,18px)/1.3 var(--font-sans,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif)}.scene b,.scene strong{font-weight:700}.label{color:var(--muted)}.code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.pill{border:1px solid var(--line);border-radius:8px;padding:.4em .65em;background:var(--bg)}.active{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 10%,var(--surface))!important}.title{font-weight:700;color:var(--accent)}.row{display:flex;align-items:center;gap:8px;margin:clamp(12px,5vmin,30px) 0}.row .label{width:26%;font-size:.85em}.cells{display:flex;gap:4px;flex:1}.cells i{height:clamp(22px,8vmin,52px);flex:1;border-radius:5px;background:var(--accent-3);opacity:.35}.cells i.on{opacity:1}.row:last-of-type .cells i{background:var(--accent)}.foot{font-size:.85em;color:var(--muted)}let n=1;for(const id of ["raw","memo"]){document.getElementById(id).innerHTML="<i></i><i></i><i></i><i></i><i></i>"}function tick(){document.getElementById("turn").textContent=n;[...document.querySelectorAll("#raw i")].forEach((x,i)=>x.classList.toggle("on",i<n%6));[...document.querySelectorAll("#memo i")].forEach((x,i)=>x.classList.toggle("on",i===0));n=n%5+1}tick();setInterval(tick,850)useMemo는 계산 결과를, useCallback은 함수 참조를 의존성 기준으로 재사용합니다. React.memo와 함께 쓰면 자식 렌더를 건너뛸 수도 있습니다.
데모는 무관한 부모 상태가 바뀔 때 반복 계산과 재사용 경로를 비교합니다. 메모이제이션은 비용이 있으므로 측정 없이 모든 곳에 넣지 마세요.
비싼 계산이나 안정적인 참조가 실제 병목일 때 프로파일링 후 적용합니다.