리액트에서 불변성을 지켜주는 이유는 리액트가 상태를 업데이트 하는 원리 때문이다.
먼저 상태의 불변성에서 불변성이란, 메모리 영역에서 값이 변하지 않는다 라는 의미이다.
리액트는 상태값을 업데이트 할 때 얕은 비교를 수행한다.
배열이나 객체의 속성 하나하나를 비교하는게 아니라
이전 참조값과 현재 참조값만을 비교하여 상태 변화를 감지하는 것이다.
이런 이유로 배열이나 객체를 업데이트 할 때
새로운 참조 주소값을 가진 배열이나 객체를 생성한다.
그렇게 불변성을 지킴으로써 효율적으로 상태를 업데이트하고 감지할 수 있다.
불변성을 지켜줌으로써 얻게 되는 또 다른 이점은 사이드 이펙트가 방지되는 점이다.
외부에 존재하는 원본데이터를 직접 수정하지 않고,
원본데이터의 복사본을 만들어서 값을 사용하기에 예상치 못한 오류를 사전에 방지할 수 있다.
다시 반대로 생각해보면 외부의 값을 함부로 변경할 수 있는 것은 위험한 일이다.
만약 다른 어떤 곳에서 원본데이터를 사용하고 있다고 하면
어플리케이션 어딘가에서 사이드 이펙트가 일어날 가능성이 있기 때문이다.
결국 리액트는 불변성을 지킴으로 인해 효과적인 상태 업데이트와 사이드 이펙트를 방지하는 이점들을 얻고 있다.
얕은 비교란 객체의 프로퍼티를 하나하나 다 비교하지 않고,
객체의 참조 주소값만 변경되었는지 확인한다.
얕은 비교는 계산 리소스를 줄여주기 때문에 리액트는 효율적으로 상태를 업데이트 할 수 있다.
원시타입은 애시당초 불변성 특징을 가지고 있지만
참조타입인 객체나 배열의 경우 값을 변경할 때 원본데이터가 변경될 여지가 있다.
(불변성이 지켜지지 않을 수 있다). 이렇게 원본 데이터가 변경될 경우,
이 원본데이터를 참조하고 있는 다른 객체에서 예상치 못한 오류가 발생할 수 있다.
프로그래밍의 복잡도도 올라간다.
따라서 불변성을 지켜주면 사이드 이펙트를 방지하고 프로그래밍의 구조를 단순하게 유지할 수 있다.