https://poiemaweb.com/js-immutability
이 단원은 처음에 이해가 어려웠는데, 함수형 프로그래밍에 대한 배경 설명이 없었기 때문이다.
- 함수형 프로그래밍이란 깔끔하고 유지보수가 용이한 소프트웨어를 만들기 위해 최대한 효과적으로 함수를 사용하는 것을 의미한다. 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이다.
- 함수형 프로그래밍에 필요한 여러 개념이 있는데, 그중에 하나가 불변성(Immutability)라는 개념이다.
Immutability(변경불가성)
- 객체(Object)가 생성된 후 그 상태를 변경할 수 없도록 하는 디자인 패턴을 의미한다.
- 문제는 JS의 객체는 기본적으로 변경이 가능한 특성을 가지고 있고, 따라서 JS에서 함수형 프로그래밍을 하기 위해서는 별도의 기능을 사용해 주어야 한다. 이 단원은 그런 기능들에 관한 내용이다.
- 아직 나는 JS에서 함수형 프로그래밍을 적용하는 방법에 큰 관심이 없기 때문에 상대적으로 우선순위가 떨어지는 단원인것 같다.
1. immutable value vs. mutable value
Javascript의 원시 타입(primitive data type)은 변경 불가능한 값(immutable value)이다.
- 원시 타입들: Boolean, null, undefined, Number, String, Symbol(ES6)
Javascript에서 원시 타입 이외의 모든 값은 객체(Object)타입이며 객체 타입은 변경 가능한 값(mutable value)이다.
var str = 'Hello'; // C와 다르게 JS의 문자열은 immutable value이다.
str = 'world'; // 이는 재할당은 가능하지만 메모리 영역에서의 변경이 불가능하다는 뜻이다.
- 위 코드는 이전에 생성된 문자열 ‘Hello’를 수정하는 것이 아니라 새로운 문자열 ‘world’를 메모리에 생성하는 동작을 실행한다. 즉 문자열 ‘Hello’와 ‘world’는 모두 메모리에 존재하고 있으며, 변수 str은 문자열 ‘Hello’를 가리키고 있다가 ‘world’를 가리키도록 변경되었을 뿐이다.
- 반면 원시 타입이 아닌 값들, 예를 들어 배열이나 객체는 변경이 가능한 값이므로 = 연산자를 사용할 시 재할당이 일어나는 게 아니라 참조(reference)가 발생한다.
var user1 = {
name: 'Lee',
address: {
city: 'Seoul'
}
};
var user2 = user1;
// 변수 user2는 객체 타입이다. mutable value이므로 재할당이 아닌 참조가 발생한다.
user2.name = 'Kim';
console.log(user1.name); // Kim
console.log(user2.name); // Kim

Pass-by-reference
object를 immutable 하게 만들기 위해 const를 사용할 수 있을까?
- 그렇지 않다. const object를 만들면 object자체에 대해 = (assignment)를 할 수는 없겠지만
- 여전히 자유롭게 property를 변경할 수 있기 때문이다.