const Sub = ({appNo}) => {
SubCallCount++;
console.log(`Sub ${SubCallCount}번 실행됨`);
const [no, setNo] = useState(0);
const [no2, setNo2] = useState(0);
useEffect(() => {
console.log('effect 1 : 최초에 한번만 실행');
},[]); // props : 상위 컴포넌트가 하위 컴포넌트에 값을 전달할때 사용하는 속성
useEffect(() => {
console.log('effect 2 : 부모의 appNo가 바뀔때마다 실행');
},[appNo]);
useEffect(() => {
console.log('effect 3 : 나(Sub)의 no가 바뀔때마다 실행');
},[no]);
useEffect(() => {
console.log('effect 4 : appNo 혹은 no가 바뀔때마다 실행');
},[appNo, no]);
useEffect(() => {
console.log('effect 5 : 매번 실행');
});
return (
<>
<button onClick={() => setNo(no + 1)}>Sub 버튼(no) : {no}</button>
<button onClick={() => setNo2(no2 + 1)}>Sub 버튼(no2) : {no2}</button>
</>
);
};
const App = () => {
AppCallCount++;
console.log(`App ${AppCallCount}번 실행됨`);
const [no, setNo] = useState(0);
return (
<>
<div style={{ border: "5px solid red", padding: 10 }}>
App no : {no}
<Sub appNo={no}/>
<hr />
<button onClick={() => setNo(no + 1)}>App 버튼 : {no}</button>
</div>
</>
);
};
for(let i = 2; i <= 100; i++){: i라는 변수를 2부터 100까지 반복하면서 증가시키는 반복문을 시작합니다. 이 반복문은 소수를 찾기 위해 2부터 100까지의 모든 숫자를 확인한다.
let c = 0;: c라는 변수를 선언하고 0으로 초기화합니다. 이 변수는 현재 숫자 i가 나누어지는 수의 개수를 세는 데 사용된다.
for(let j = 1; j <= i ; j++){: 내부 반복문에서 j라는 변수를 사용하여 i를 1부터 i까지 반복하면서 나눌 수 있는지 확인한다.
if(i%j==0){ c=c+1; }: i를 j로 나누었을 때 나머지가 0이면, c를 증가시킵니다. 즉, j가 i의 약수라는 뜻이다.
if(c==2){ console.log(i); }: 외부 반복문에서 c가 2인 경우에만, 즉 약수가 1과 자기 자신뿐인 경우에만 i를 출력합니다. 따라서 이 때의 i는 소수다.
console.clear();
for(let i = 2; i <= 100; i++){
let c = 0;
for(let j = 1; j <= i ; j++){
if(i%j==0){
c=c+1;
}
}
if(c==2){
console.log(i);
}
}
// 소수 판별기(넘겨진 값이 소수인지 아닌지)
function isPrimeNumber(num) {
if (num <= 1) return false;
for (let i = 2; i < num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
// 1부터 n까지 수 중에서 소수만 배열담아서 리턴
function getPrimeNumbers(maxValue) {
const primeNumbers = [];
for (let i = 1; i <= maxValue; i++) {
if (isPrimeNumber(i)) {
primeNumbers.push(i);
}
}
return primeNumbers;
}
function getPrimeNumbersCount(maxValue) {
return getPrimeNumbers(maxValue).length;
}
const App = () => {
const [inputedNo,setInputedNo] = useState(0);
const primeNumberCount = getPrimeNumbersCount(inputedNo);
const onSubmit = (e) => {
e.preventDefault();
const form = e.target;
form.number.value = form.number.value.trim();
if(form.number.value.length == 0){
alert('숫자 써');
form.number.focus();
return;
}
const number = form.number.valueAsNumber;
form.number.focus();
setInputedNo(number);
// alert(`네가 입력한 숫자는 ${number} (이)다.`);
}
return (
<>
<form onSubmit={onSubmit}>
<input type="number" name="number" placeholder="숫자 입력해" defaultValue="0"/>
<button type="submit">확인</button>
<div>MAX : {inputedNo}</div>
<hr/>
<div>소수의 갯수 : {primeNumberCount}</div>
<hr/>
</form>
</>
);
};
// 소수 판별기(넘겨진 값이 소수인지 아닌지)
function isPrimeNumber(num) {
if (num <= 1) return false;
for (let i = 2; i < num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
// 1부터 n까지 수 중에서 소수만 배열담아서 리턴
function getPrimeNumbers(maxValue) {
const primeNumbers = [];
for (let i = 1; i <= maxValue; i++) {
if (isPrimeNumber(i)) {
primeNumbers.push(i);
}
}
return primeNumbers;
}
function getPrimeNumbersCount(maxValue) {
return getPrimeNumbers(maxValue).length;
}
const App = () => {
const [no,setNo] = useState(0);
const [inputedNo,setInputedNo] = useState(0);
const [primeNumberCount, setPrimeNumberCount] = useState(0);
// inputedNo 값이 변경 되었을 때만 재랜더링
useEffect(() => {
const primeNumberCount = getPrimeNumbersCount(inputedNo);
setPrimeNumberCount(primeNumberCount);
},[inputedNo]);
const onSubmit = (e) => {
e.preventDefault();
const form = e.target;
form.number.value = form.number.value.trim();
if(form.number.value.length == 0){
alert('숫자 써');
form.number.focus();
return;
}
const number = form.number.valueAsNumber;
form.number.focus();
setInputedNo(number);
// alert(`네가 입력한 숫자는 ${number} (이)다.`);
}
return (
<>
<button onClick={() => setNo(no + 1)}>번호 : {no}</button>
<hr/>
<form onSubmit={onSubmit}>
<input type="number" name="number" placeholder="숫자 입력해" defaultValue="0"/>
<button type="submit">확인</button>
<div>MAX : {inputedNo}</div>
<hr/>
<div>소수의 갯수 : {primeNumberCount}</div>
<hr/>
</form>
</>
);
};
const App = () => {
const [no,setNo] = useState(0);
const [inputedNo,setInputedNo] = useState(0);
// const [primeNumberCount, setPrimeNumberCount] = useState(0);
// // inputedNo 값이 변경 되었을 때만 재랜더링
// useEffect(() => {
// const primeNumberCount = getPrimeNumbersCount(inputedNo);
// setPrimeNumberCount(primeNumberCount);
// },[inputedNo]);
// 계산을 하거나 번호를 증가시키면 app재실행 -> 작동 시간 느림
// const primeNumberCount = getPrimeNumbersCount(inputedNo);
// useMemo : 기억을 한다.
// useMemo : iuputedNo 값이 바뀌면 getPrimeNumbersCount를 실행.
// 저장장치를 쓴다와는 거리가 있다.
const primeNumberCount = useMemo(() => getPrimeNumbersCount(inputedNo),[inputedNo]);
const onSubmit = (e) => {
e.preventDefault();
const form = e.target;
form.number.value = form.number.value.trim();
if(form.number.value.length == 0){
alert('숫자 써');
form.number.focus();
return;
}
const number = form.number.valueAsNumber;
form.number.focus();
setInputedNo(number);
// alert(`네가 입력한 숫자는 ${number} (이)다.`);
}
return (
<>
<button onClick={() => setNo(no + 1)}>번호 : {no}</button>
<hr/>
<form onSubmit={onSubmit}>
<input type="number" name="number" placeholder="숫자 입력해" defaultValue="0"/>
<button type="submit">확인</button>
<div>MAX : {inputedNo}</div>
<hr/>
<div>소수의 갯수 : {primeNumberCount}</div>
<hr/>
</form>
</>
);
};
// 소수 판별기(넘겨진 값이 소수인지 아닌지)
function isPrimeNumber(num) {
if (num <= 1) return false;
for (let i = 2; i < num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
// 1부터 n까지 수 중에서 소수만 배열담아서 리턴
function getPrimeNumbers(maxValue) {
const primeNumbers = [];
for (let i = 1; i <= maxValue; i++) {
if (isPrimeNumber(i)) {
primeNumbers.push(i);
}
}
return primeNumbers;
}
function getPrimeNumbersCount(maxValue) {
return getPrimeNumbers(maxValue).length;
}
const PrimeNumbersCount = ({max}) => {
const count = getPrimeNumbersCount(max);
return <>
<div style={{border:"10px solid black", padding: 50, display: 'flex', alignItems:'center', justifyContent:'center'}}>
1부터 {max} 사이에 존재하는 소수의 갯수 : {count} 개
</div>
</>
}
let AppCallCount = 0;
const App = () => {
AppCallCount++;
console.log(`App이 ${AppCallCount}번 실행`);
return (
<>
<PrimeNumbersCount max={100}/>
<hr/>
<PrimeNumbersCount max={200}/>
<hr/>
<PrimeNumbersCount max={300}/>
<hr/>
<PrimeNumbersCount max={200000}/>
</>
);
};
const PrimeNumbersCount = ({max}) => {
// const count = getPrimeNumbersCount(max);
const [count, setCount] = useState(0);
useEffect(() => {
const count = getPrimeNumbersCount(max);
setCount(count);
}, [max]);
return <>
<div style={{border:"10px solid black", padding: 50, display: 'flex', alignItems:'center', justifyContent:'center'}}>
1부터 {max} 사이에 존재하는 소수의 갯수 : {count} 개
</div>
</>
}
const PrimeNumbersCount = ({max}) => {
const count = useMemo(() => getPrimeNumbersCount(max), [max]);
// const [count, setCount] = useState(0);
// useEffect(() => {
// const count = getPrimeNumbersCount(max);
// setCount(count);
// }, [max]);
return <>
<div style={{border:"10px solid black", padding: 50, display: 'flex', alignItems:'center', justifyContent:'center'}}>
1부터 {max} 사이에 존재하는 소수의 갯수 : {count} 개
</div>
</>
}
useMemo(() => {
return value;
}. [item])