기타

인치의 불변성

알럽유 2024. 4. 15. 10:00
728x90

https://youtu.be/eV4Yzssr9MA?si=Cn55ZEwDshidJUpq

 

인치의 불변성

불변성은 '변하지 아니하는 성질' 이라는 사전적 의미를 가지고 있습니다.

말그대로 바뀌지 않는다는 뜻이며 이개념은 함수형 프로그래밍 에서 중요하게 여겨지는 개념 중 하나입니다.

이런 함수형 프로그래밍 방식을 지향하는 자바스크립트에서도 불변성은 아주 중요한 개념입니다. 

자바스크립트에서 원시타입은 불변하고, 참조타입(객체)은 가변적 입니다.

 

여기 코드를 볼때 a라는 이름을 가진 변수에 숫자1을 할당했습니다.

이때 a는 원시타입중 하나인 넘버타입임을 확인할수 있습니다.

이번에 기존에 1이라는 값에 할당한 변수a에 2라는 값을 재할당 해줍니다.

그리고 a라는 변수는 정상적으로 2로 바뀐것으로 알수 있습니다.

 

다음 예제와 같이 서로 다른변수에 같은 값을 할당하더라도

같은 데이터 영역을 가리키는 형태가 가능하고

둘중에 한 변수의 값을 바꾸더라도 다른변수의 값이 바뀌지 않게 된다는 것도 앞서 확인했습니다.

 

다음은 참조타입의 객체가 하나 있습니다.

우선 빈 변수 영역에 변수 obj를 정장합니다.

그리고 변수 obj는 여러 속성들로 이루어진 데이터 임을 확인하고

이 속성들을 위한 별도의 변수 영역을 새롭게 할당합니다.

그리고 새로 할당한 변수 영역에 대한 주소 범위를 데이터 영역에 저장합니다.

그와 동시에 변수 obj에는 이렇게 주소 범위가 기록된 데이터에 대한 주소가 저장됩니다. 

이제 앞서 객체 obj를 위해 할당한 변수영역에 내부 속성 변수인 a,b를 새롭게 저장합니다.

그리고 변수a,b에 저장된 값이 원시타입임을 확인 할 수 있고 해당되는 데이터를 할당하고 

변수 영역에 주소값을 저장합니다.

 

이러한 특징때문에 참조 타입이 가변적이다라고 할수 있습니다.

 

 

 

자바스크립트에서 참조타입은 가변적이다. 참조타입내 데이터 영역의 값들은 불변하지만.

변수 영역의 값들은 가변적이다.

 

불변성 유지 방식의 이점

1. 예측가능(predictable)

2. 성 능 효율성(efficiency)

 

 

1. 예측가능성

우선 예측가능성에서 불변성에서 불변성의 어떤 이점이 있는지 보겠습니다.

앞서 우리는 메모리 영역이 불변하고 배웠습니다.

하지만 만약 데이터 영역의 값이 가변 된다면 어떻게 될까요?

앞서 원시타입의 불변성 이야기를 할 때 보았던 예제입니다.

데이터 영역이 가변적일고 할 때 위의 예제에서 변수 a에 2를 저장하게 되면 기존의 데이터 1이 저장되어있는 공간에

데이터 2가 덮어 씌어지게 됩니다. 그와 동시에 변수 b의 값도 바뀌게 되지만 우리는 알아차리지 못합니다.

 

1. 성능 효율성

1. 메모리 영역 성능

2. 상태 변경 추적 성능

 

 

 

1. 메모리 영역 성능

 

 

메모리 영역 성능은 다음 예제로 쉽게 설명 할 수 있습니다.

한 변수의 값을 바꾸면서

다른 변수의 값이 바뀌는 문제를 방지하기 위해 변수마다 서로 다른 데이터 영역의 값을 할당한다고 해 봅시다.

이와 같은식으로 구현하게 되면 데이터 사이드 이펙트 문제는 방지할 수 있겠지만 다른 새로운 문제를 맞이 하게 됩니다.

만약 10억개의 변수에 같은 값을 할당하게 된다면 어떨까요

데이터의 값이 동일함에도 불구 하고 불필요하게 데이터 영역을 차지하게 됩니다.

이는 추가 메모리 할당을 유발하며 메모리 소비량에서 비효율적입니다.

 

 

 

2. 상태 변경 추적 성능

우리는 자바스트립트가 불변성을 유지하는 성질 덕분에 값을 비교하는 행위에서

실제 데이터의 값이 바뀌었는지 까지 확인하고 비교하는 것이 아니라

 

변수를 참조하고 있는 데이터의 위치에 변경여부만을 확인함으로써 값을 비교할 수있습니다.

그리고 이러한 방식의 비교는 복잡한 객체비교 과정에서의 오버헤드 부하를 방지하고

구성요소가 어떻게 업데이트 되는지 파악하는 부담을 줄여줍니다.

 

 

 

3줄요약

1. 일반적으로 JS의 불변성은 메모리상 데이터 영역의 불변성을 의미한다.

2. 불변성은 예측 가능성, 성능 효율성(메모리 영역과 변화 추적) 에 좋다

3. 변수도 불변성을 유지할 수 있다(const, object.freeze, immutable.js)