사전적으로 불변성이란 값이나 상태를 변경할 수 없는 것을 의미한다.
Boolen
, Number
, String
, null
, undefined
, Symbol
과 같은 타입들은 불변성을 유지하는 타입들이고 Object
타입들은 변경 가능한 값들이다.
// 원시타입
const [number, setNumber] = useState(0)
setState(3)
// 참조타입
const [person, setPerson] = useState({ name: '', age: 30 })
setState({...person, name: 'pyo'})
부모 컴포넌트가 re-rendering 되거나 state, props가 변화될 때 렌더링이 일어난다. 근데 렌더링을 할지 말지 판단하기 위해 state 객체 내의 모든 value를 다 깊은 비교하면 효울적이지 않다. 그렇기 때문에 이전 객체와 현재 객체를 얕은 비교로 판단하기 때문에 불변성 유지가 중요하다.
효율적인 상태 업데이트 (얕은 비교 수행)
사이드 이펙트 방지 및 프로그래밍 구조의 단순성
spread operator
, map
, filter
, slice
, reduce
등 새로운 배열을 반환하는 메소드들을 활용한다.
setState
를 이용할 때 원시 타입 경우에는 값을 바로 넣어주면 되지만 참조 타입인 경우에는 새로운 객체나 배열을 생성한 후 값을 넣어준다.