React
불변성 지키기
김꼬알
2023. 7. 11. 14:56
불변성
불변성이랑 사전적 의미로는 값이나 상태를 변경할 수 없는 것을 의미함
자바스크립트 타입을 통한 분별성 의미
- 원시 타입은 불변성(immutable)을 가지고 있고 참조 타입은 그렇지 않음(mutable)
- 원시 타입: Boolean, String, Number, null, undefined, symbol
- 참조 타입: Object, Array
- 기본적으로 Javascript는 원시 타입에 대한 참조 및 값을 저장하기 위해 Call stack 메모리 공간을 사용하지만 참조 타입의 경우 Heap이라는 별도의 메모리 공간을 사용
- 이 경우 Call stack은 개체 및 배열 값이 아닌 메모리에만 Heap 메모리 참조 ID를 값으로 저장함
- 원시 타입: 고정된 크기로 Call stack 메모리에 저장, 실제 데이터 변수에 할당
let username = "walter";
username = "john";
/* 이것은 username walter를 john으로 대체한 것이 아닌
메모리 영역 a에 있는 walter라는 값을 그대로 두고 메모리 영역 b에 john을 새로 할당한 것
*/
- 이렇게 불변성을 가지고 있기 때문에 리액트에서 불변성을 위해서 따로 신경써주지 않아도 됨
- 참조 타입: 데이터 크기가 정해지지 않고 Call stack 메모리에 저장, 데이터의 값이 Heap에 저장되며 변수에 Heap 메모리의 주소값이 할당
let array = ['1', '2', '3'];
array = ['4', '5', '6'];
/* 배열에 대한 요소를 추가하거나 객체 속성 값을 변경할 때
Call stack의 참조 ID는 동일하게 유지되고 Heap 메모리에서만 변경됨
*/
- 참조 타입은 불변성이 유지되지 않기 때문에 리액트에서 따로 신경을 써줘야 함
불변성을 지켜야 하는 이유
- 참조 타입에서 객체나 배열의 값이 변할 때 원본 데이터가 변경되기에 이 원본 데이터를 참조하고 있는 다른 객체에서 예상치 못한 오류가 발생할 수 있어 프로그래밍의 복잡도가 올라감
- 리액트에서 화면을 업데이트할 때 불변성을 지켜서 값을 이전 값과 비교해서 변경된 사항을 확인한 수 업데잉트하기 때문에 불변성을 지켜줘야 함
불변성을 지키는 방법
- 참조 타입에서는 값을 바꿨을 때 Call stack 주소 값은 같은데 Heap 메모리 값만 바꿔주기에 불변성을 유지할 수 없으므로 아예 새로운 배열을 반환하는 메소드를 사용하면 됨
- spread operator, map, filter, slice, reduce
- 원본 데이터를 변경하는 메소드 : splice, push
const array = [1, 2, 3, 4];
const sameArray = array;
sameArray.push(5);
console.log(array === sameArray); // true
const array = [1, 2, 3, 4];
const differentArray = [...array, 5];
console.log(array === differentArray); // false