- memoization: 먼저 메모이제이션이라고 하는 개념에 대해 확실히 알아가야하는데, 메모이제이션은 기존에 수행한 연산의 결과값을 어딘가에 저장해두고 동일한 입력이 들어오면 재활용하는 프로그래밍 기법입니다.
이것을 적절하게 활용하면 중복 연산을 피할 수 있기 때문에 메모리를 조금 더 쓰더라도 애플리케이션의 성능을 최적화 할 수 있습니다.
즉, 불필요한 연산, 중복되는 연산을 막아서 불필요한 재렌더링을 방지하기 위한 hooks이다.(만약 10만번 연산을 해야하는 코드가 있는데 그걸 계속 연산해야 한다면?? 정말 느려질 것이다.)
우선 숫자가 증감하는 input 과 위치 변경 버튼을 누를때다 isKorea의 state true,false가 바뀌면서 한국,외국으로 컴포넌트가 렌더링이 되는 코드이다. (h2태그의 location.where이 아니라 location이다.)
useEffect 의존성 배열에 location값만 추가해줬기 때문에 숫자가 증감하는 인풋창에서 숫자를 아무리 올리고 내려도 useEffect가 호출되지 않는다.
코드를 수정해서 변수로 선언했던 location을 객체로 만들었다. 그 외에 수정된 것은 없다. useEffect의존성 배열에도 location값만 넣어줬다.
- 그런데 실제로 인풋창에서 숫자를 변화시키면 useEffect가 호출되는것을 볼 수 있다.
자바스크립트에는 원시(Primitive) 타입, 객체(Object)타입이 있다.
const primitive = "korea"
const primitive2 = "korea"
primitive === primitive2 // true
const object = {
country:"korea"
}
const object2 = {
country:"korea"
}
object === object2 //false
우리가 number state값을 바꾸면 컴포넌트가 다시 렌더링이 되고 location은 객체를 다시 할당을 받을 것이다. 아무리 눈으로 보기에 똑같이 생겼어도 다른 객체라는 것이다. 즉, 이전에 있던 객체랑은 다른 메모리 공간에 저장이 된다. 그래서 또 생성된 주소를 참조하게 되는것이고, 그래서 location이 참조하고 있는 주소가 바꼈기 때문에 useEffect가 실행되는것이다.
요즘은 공부를 하면 할 수록 코드를 짤 때 기능을 구현하고 정상적으로 작동하는 것보다, 예를 들어 리액트의 컴포넌트 렌더링 과정, 동작원리, 비동기적인 실행 이러한 것들을 고려해서 효율적이고 최적화된 코드를 짜는것이 중요하단 것을 깨닫고 있는것 같다.