(JS) 불변성에 대한 고찰
2023. 6. 30. 00:01- 원시 타입의 값에는 7종류, string, number, bigint, boolean, undefined, symbol, null이 있다.
- 원시 타입 데이터는 불변성이 있다. (=값이 변하지 않는다, = 데이터 값을 직접 수정할 수 없다.)
- 원시 데이터 값은 한 번 생성되면 변경할 수 없다. 변경하려면 새로운 값을 할당해야한다.
새로운 값을 할당하면 메모리 주소가 변한다. 그런데 왜 불변하다고 하느냐, 메모리 주소의 변경과 불변성에서의 변경이 다른 개념이기 때문이다. - 메모리 주소는 데이터를 저장하기 위한 공간인 컴퓨터의 메모리 중, 저장된 위치를 식별하기 위한 위치 값이다. 데이터의 값이 변경되면 메모리 주소도 변할 수 있다.
- 따라서, 원시 데이터의 값은 불변하지만 해당 값이 저장된 메모리 주소는 값이 변경됨에 따라 다를 수 있다. 불변성은 데이터의 값을 직접 수정 할 수 없다는 개념을 나타내는 것이며, 메모리 주소의 변화와는 별개의 개념이다.
- let number1 = 2
let number1 = 4
2가 있는 메모리주소에서 직접 4로 변경하는게 아니라 새로운 메모리주소에 4를 담고, 바라본다.
즉, 2->4로 곧바로 변화한 게 아니라 새롭게 할당한 것 뿐이다. - let number2 = 3
let number 3 = 3
number2 === number3 // true
- 객체(Object)나 배열(Array)과 같은 자료형은 불변성이 없다. (=값이 변한다, = 데이터 값을 직접 변경할 수 있다.)
- 변경 가능하며, 그 안에 있는 값들을 직접 수정할 수 있다.
- 불변성을 유지하는 것에는 의미가 있다. 상태관리 및 유지보수에 도움이 되고 예측이 가능하게 만들어 안정성을 보장해주기 때문이다. 다시 말해 객체에서 불변성을 다룰 때 중요한 점은 불변성을 유지하면서도 값을 변경할 수 있어야 한다는 것이다.
- 객체의 불변성을 유지하면서 객체를 수정하기 위해서는 새로운 객체를 생성하거나 객체를 복사하여 수정해야 한다.
- 구조분해할당으로 객체의 값을 변경할 수 있다. 하지만 값이 변경된다는 것이 반드시 불변성을 유지한다는 뜻은 아니다. 객체를 복사해 온 뒤 복사본에서 구조분해할당을 하거나, 구조분해할당을 통해 추출한 변수로 새로운 객체를 생성해야만 불변성이 유지된다.
- obj1= {name : 'kim'}
obj2= {name : 'kim'}
obj1 === obj2 // false
또한, 객체의 값이 같다고 해서 일치하는 것은 아니다. obj1과 obj2는 완전히 동일한 것으로 보인다. 하지만 일치연산자(===)를 찍어보면 false가 나온다. 두 객체가 별도의 공간에서 서로 다른 메모리주소를 갖기 때문이다. - 이렇듯 값과 메모리주소의 개념을 정확히 알고 구분하는 것이 좋은 코드 구현에 도움이 된다.
'JavaScript > 튜토리얼' 카테고리의 다른 글
(JS) 객체, 배열, 생성자 함수, 계산된 프로퍼티, 객체 메서드 (0) | 2023.08.12 |
---|---|
(JS) 모던 자바스크립트 Deep Dive - 4. 원시 값과 객체의 비교 (0) | 2023.06.22 |
(JS) 모던 자바스크립트 Deep Dive - 3. 데이터 타입 (0) | 2023.06.21 |
(JS) 모던 자바스크립트 Deep Dive - 2. 표현식과 문 (0) | 2023.06.21 |
(JS) 모던 자바스크립트 Deep Dive - 1. 변수 (0) | 2023.06.21 |