import { useMemo, useState } from "react";
import "./App.css";
const hardCalculate = (number) => {
console.log("어려움 시간이 오래걸림 쓸데없는 반복을 돌기때문");
// 스테이트에 값을 게속 넣고 비교하기때문에 렌더링을 반복문 만큼 게속하게되고
// 즉각적으로 값을 변화시키는게 아니기 때문에 딜레이 값이 있음
for (let i = 0; i < 9999999; i++) {
return number + 10000;
}
};
const easyCalculate = (number) => {
// 마찬가지로 쉬운 계산기를 만들어도 App컴포넌트 안에 있어서
// 전체적으로 렌더링이 되기때문에 hardCalculate도 동작을 해서
// 쉬운계산기여도 딜레이를 가지게됨 이때 useMemo를 사용하면 좋음
console.log("쉬움");
return number + 1;
};
function App() {
const [hardNumber, setHardNumber] = useState(1);
const [easyNumber, setEasyNumber] = useState(1);
const hardSum = hardCalculate(hardNumber);
const easySum = easyCalculate(easyNumber);
return (
<div>
<h3>어려운 계산기</h3>
<input
type="number"
value={hardNumber}
onChange={(e) => setHardNumber(e.target.value)}
/>
<span> + 10000 = {hardSum}</span>
<h3>쉬운 계산기</h3>
<input
type="number"
value={easyNumber}
onChange={(e) => setEasyNumber(e.target.value)}
/>
<span> + 10000 = {easySum}</span>
</div>
);
}
export default App;

const hardSum = useMemo(() => {
// use Memo는 두가지의 인자를 받음, 콜백함수, 의존성배열
// 아래와같은 코드로 작성하면 hardNumber가 변경이 될때만
// hardCalculate 함수가 돌기때문에 불필요한 렌더링을 방지할수있고
// hardNumber가 변경되지않으면 이전에 가지고있던 값을 메모리에 저장해두었다가 사용함
return hardCalculate(hardNumber);
}, [hardNumber]);

import React, { useEffect, useMemo, useState } from "react";
export default function App() {
const [number, setNumber] = useState(0);
const [isKoran, setKorea] = useState(true);
const location = useMemo(() => {
// 이렇게 useMemo를 사용하여 객체타입은 불필요한 렌더링을 방지하면
// 햄최면 Input을 클릭해도 객체타입은 렌더링을 하지않게됨
return {
country: isKoran ? "한국" : "외국",
};
}, []);
useEffect(() => {
console.log("useEffect 호출함");
// 의존성배열에 원시타입이아닌 객체타입이 들어가면
// 햄최몇의 input값이 바뀌어도 렌더링이되어 콘솔이 찍히게됨
// 그 이유는 자바스크립트가 동작하는 원리때문인데
// 원시타입의 경우 값을 그대로 가져오지만
// 객체타입의 경우 메모리값이 할당되고 그 메모리안에 할당이되고
// 그객체안의 변수에는 메모리의 값이아닌 메모리의 주소가 할당됨
//그예로 같은 원시데이터를 비교하면 true가 나오지만
// 같은 객체타입을 비교하면 false가 나옴
// 그이유는 객체안의 변수에는 메모리의 주소가 다르기때문임
}, [location]);
return (
<div>
<h2>햄최몇?</h2>
<input
value={number}
type="number"
onChange={(e) => {
setNumber(e.target.value);
}}
/>
<hr />
<h2>어디사냐?</h2>
<p>여기살고 있는데 왜? 뭐? {location.country}</p>
<button onClick={() => setKorea(!isKoran)}> 아니그냥</button>
</div>
);
}
이 방식은 함수에 인자를 전달할 때 값 자체를 복사하여 전달합니다. 함수 내부에서 인자의 값이 변경되어도 호출된 쪽에는 영향을 주지 않습니다.
호출하는 변수의 값만을 복사하여 함수 내부로 전달되기 때문에, 함수 내부에서 해당 값을 변경하더라도 호출된 곳의 변수 값에는 영향을 주지 않습니다.
대부분의 언어에서 함수의 인자 전달 방식이 이 방식으로 이루어집니다.
이 방식은 함수에 인자를 전달할 때 변수의 참조(메모리 주소)를 전달합니다. 따라서 함수 내부에서 해당 참조를 통해 변수 값을 직접 변경할 수 있음.
함수에 인자로 변수를 전달할 때, 변수의 메모리 주소가 전달되므로 함수 내에서 변수 값을 변경하면 호출한 곳에서도 변경된 값을 확인할 수 있습니다.
이 방식은 몇몇 언어에서 사용되며, 일반적으로 포인터나 참조를 이용하여 구현됩니다.