πŸ” λ¦¬μ•‘νŠΈ Hooks

  • λ¦¬μ•‘νŠΈμ—μ„œ ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·Έ 쀑에 HooksλŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • HooksλŠ” 기쑴에 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•  수 μ—†μ—ˆλ˜ μƒνƒœ κ΄€λ¦¬λ‚˜, λ Œλ”λ§ ν›„ μž‘μ—…μ„ μ„€μ •ν•˜λŠ” κΈ°λŠ₯ λ“±μ˜ μž‘μ—…μ„ ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

πŸ“‹useMemoλž€?

useMemoλŠ” λ¦¬μ•‘νŠΈμ—μ„œ μ»΄ν¬λ„ŒνŠΈμ˜ μ„±λŠ₯을 μ΅œμ ν™” ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” Hookμž…λ‹ˆλ‹€ useMemoμ—μ„œ memoλŠ” MEMOIZATION을 λœ»ν•˜λŠ”λ° μ΄λŠ” κ·ΈλŒ€λ‘œ ν•΄μ„ν•˜λ©΄ β€˜λ©”λͺ¨λ¦¬μ— 넣기’ λΌλŠ” 의미이며 컴퓨터 ν”„λ‘œκ·Έλž¨μ΄ λ™μΌν•œ 계산을 λ°˜λ³΅ν•΄μ•Ό ν•  λ•Œ, 이전에 κ³„μ‚°ν•œ 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•¨μœΌλ‘œμ¨ λ™μΌν•œ κ³„μ‚°μ˜ 반볡 μˆ˜ν–‰μ„ μ œκ±°ν•΄ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 속도λ₯Ό λΉ λ₯΄κ²Œ ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€.

μ‰½κ²Œ λ§ν•˜λ©΄ λ™μΌν•œ 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό 반볡적으둜 ν˜ΈμΆœν•΄μ•Όν•œλ‹€λŠ” 처음 값을 계산할 λ•Œ ν•΄λ‹Ή 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•΄ ν•„μš”ν•  λ•Œλ§ˆλ‹€ λ‹€μ‹œ κ³„μ‚°ν•˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬μ—μ„œ κΊΌλ‚΄μ„œ μž¬μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ¦¬μ•‘νŠΈμ—μ„œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” λ Œλ”λ§ => μ»΄ν¬λ„ŒνŠΈ ν•¨μˆ˜ 호좜 => λͺ¨λ“  λ‚΄λΆ€ λ³€μˆ˜ μ΄ˆκΈ°ν™”μ˜ μˆœμ„œλ₯Ό κ±°μΉ©λ‹ˆλ‹€.


useMemoλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ λ°œμƒν•˜λŠ” 연산을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ¨Όμ € λ¦¬μŠ€νŠΈμ— 숫자λ₯Ό μΆ”κ°€ν•˜λ©΄ μΆ”κ°€λœ μˆ«μžλ“€μ˜ 평균을 보여 μ£ΌλŠ” ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

import { useState } from "react";

const getAverage = (numbers) => {
  console.log("평균값 계산 쀑...");
  if (numbers.length === 0) return 0;
  const sum = numbers.reduce((a, b) => a + b);
  return sum / numbers.length;
};

const Average = () => {
  const [list, setList] = useState([]);
  const [number, setNumber] = useState("");

  const onChange = (e) => {
    setNumber(e.target.value);
  };

  const onInsert = (e) => {
    const nextList = list.concat(parseInt(number));
    setList(nextList);
    setNumber("");
  };

  return (
    <div>
      <input value={number} onChange={onChange} />
      <button onClick={onInsert}>등둝</button>
      <ul>
        {list.map((value, index) => (
          <li key={index}>{value}</li>
        ))}
      </ul>
      <div>
        <b>평균값:</b>
        {getAverage(list)}
      </div>
    </div>
  );
};

export default Average;

λ‹€μŒμœΌλ‘œ Appμ—μ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ ν•˜μ„Έμš”

import Average from "./Average";

const App = () => {
  return <Average />;
};

export default App;

μœ„ μ½”λ“œλŠ” Reactλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°„λ‹¨ν•œ 평균값 계산기λ₯Ό λ§Œλ“œλŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. useState 훅을 μ‚¬μš©ν•˜μ—¬ 숫자 λͺ©λ‘κ³Ό μž…λ ₯값을 κ΄€λ¦¬ν•˜κ³ , μž…λ ₯값을 λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜μ—¬ 평균값을 κ³„μ‚°ν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” 숫자λ₯Ό μž…λ ₯ν•˜κ³  β€˜λ“±λ‘β€™ λ²„νŠΌμ„ ν΄λ¦­ν•˜μ—¬ 숫자λ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ½”λ“œλ₯Ό 톡해 React의 기초 κ°œλ… 및 μƒνƒœ 관리 방법을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€


λΈŒλΌμš°μ €μ—μ„œ μˆ«μžλ“€μ„ λ“±λ‘ν•˜λ©΄ 평균값이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

useState ν›… μ‚¬μš©:

  • useState 훅을 μ‚¬μš©ν•˜μ—¬ 두 가지 μƒνƒœλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.
  • list: μž…λ ₯된 μˆ«μžλ“€μ„ μ €μž₯ν•˜λŠ” λ°°μ—΄ μƒνƒœμž…λ‹ˆλ‹€.
  • number: μž…λ ₯ ν•„λ“œμ— μž…λ ₯된 값을 μ €μž₯ν•˜λŠ” λ¬Έμžμ—΄ μƒνƒœμž…λ‹ˆλ‹€.

getAverage ν•¨μˆ˜:

  • 배열을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„ ν•΄λ‹Ή λ°°μ—΄μ˜ 평균값을 κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
  • μž…λ ₯된 배열이 λΉ„μ–΄μžˆμœΌλ©΄ 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 그렇지 μ•ŠμœΌλ©΄ λ°°μ—΄μ˜ 합을 κ΅¬ν•˜κ³ , λ°°μ—΄μ˜ 길이둜 λ‚˜λˆ„μ–΄ 평균값을 κ³„μ‚°ν•©λ‹ˆλ‹€.

Average ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ:

  • ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ Averageλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.
  • list와 number μƒνƒœλ₯Ό useState 훅을 μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•©λ‹ˆλ‹€.
  • onChange ν•¨μˆ˜λŠ” μž…λ ₯ ν•„λ“œμ˜ 값이 변경될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœλ˜μ–΄ number μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
  • onInsert ν•¨μˆ˜λŠ” 등둝 λ²„νŠΌμ΄ 클릭될 λ•Œ 호좜되며, number 값을 list 배열에 μΆ”κ°€ν•œ λ‹€μŒ number μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
  • JSXλ₯Ό λ°˜ν™˜ν•˜μ—¬ μ‚¬μš©μžκ°€ 숫자λ₯Ό μž…λ ₯ν•  수 μžˆλŠ” μž…λ ₯ ν•„λ“œμ™€ 등둝 λ²„νŠΌμ„ λ Œλ”λ§ν•©λ‹ˆλ‹€.
  • μž…λ ₯된 μˆ«μžλ“€μ„ 보여주기 μœ„ν•΄ list 배열을 λ§€ν•‘ν•˜μ—¬ 숫자 λͺ©λ‘μ„ λ§Œλ“­λ‹ˆλ‹€.
  • 평균값을 ν‘œμ‹œν•˜κΈ° μœ„ν•΄ getAverage ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ list λ°°μ—΄μ˜ 평균값을 κ³„μ‚°ν•©λ‹ˆλ‹€.

useMemo μ‚¬μš©ν•΄λ³΄κΈ°

useMemo Hook은 λ Œλ”λ§ν•˜λŠ” κ³Όμ •μ—μ„œ νŠΉμ • 값이 λ°”λ€Œμ—ˆμ„ λ•Œλ§Œ 연산을 μ‹€ν–‰ν•˜κ³  μ›ν•˜λŠ” 값이 λ°”λ€Œμ§€ μ•Šμ•˜λ‹€λ©΄ 이전에 μ—°μ‚°ν–ˆλ˜ κ²°κ³Όλ₯Ό λ‹€μ‹œ μ‚¬μš©ν•˜λŠ” 방식이닀

import React, { useState } from "react";

const getAverage = (numbers) => {
  console.log("평균값 계산쀑..");
  if (numbers.length === 0) return 0;
  const sum = numbers.reduce((a, b) => a + b);
  return sum / numbers.length;
};

const Average = () => {
  const [list, setList] = useState([]);
  const [number, setNumber] = useState("");
  const onChange = (e) => {
    setNumber(e.target.value);
  };
  const onInsert = (e) => {
    const nextList = list.concat(parseInt(number));
    setList(nextList);
    setNumber("");
  };
  const avg = useMemo(() => getAverage(list), [list]);
  return (
    <div>
      <input value={number} onChange={onChange} />
      <button onClick={onInsert}>등둝</button>
      <ul>
        {list.map((value, index) => (
          <li key={index}>{value}</li>
        ))}
      </ul>
      <div>
        <b>평균값:</b>
        {avg}
      </div>
    </div>
  );
};

export default Average;

μœ„μ— μ½”λ“œμ—μ„œ useMemo λŠ” getAverage ν•¨μˆ˜μ˜ κ²°κ³Όλ₯Ό λ©”λͺ¨μ΄μ œμ΄μ…˜ν•΄ , list 배열이 변경될 λ•Œλ§Œ 평균값을 λ‹€μ‹œ κ³„μ‚°ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨, λ¦¬μŠ€νŠΈμ— λ³€ν™”κ°€ μ—†λŠ” ν•œ 평균값을 λ°˜λ³΅ν•΄μ„œ κ³„μ‚°ν•˜λŠ” λΉ„νš¨μœ¨μ„±μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

즉, useMemo λ₯Ό μ‚¬μš©ν•˜λ©΄ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κ³ , λΆˆν•„μš”ν•œ 계산을 ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 글은 κΉ€λ―Όμ€€(velopert)λ‹˜μ˜ λ¦¬μ•‘νŠΈλ₯Ό λ‹€λ£¨λŠ” κΈ°μˆ μ„μ°Έμ‘° ν•˜μ—¬ μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€.