😊
Functional Programming - immutability
September 10, 2022
시작
읽기 전에 알면 좋은 내용:
- immutability는 함수형 프로그래밍의 핵심 개념중 하나로 pure function이 가지고 있는 특징 중 하나이다
- side effect란 local environment 가 아닌 다른 environment의 vaiable의 상태(값)를 변경 하는 것을 말한다. 예를 들어 change라는 함수가 global variable a의 값을 변경한다면 side effect가 발생한 것이다
- immutability개념을 사용하면 side effect를 방지할 수 있다
요약
- immutability란 객체가 생성된 이 후 해당 객체의 상태를 변경할 수 없다는 것을 의미한다. 조금 더 구체적으로 말하자면 메모리의 특정한 주소에 할당된 객체 값이 변경되면 안된다는 것이다
- 간단하게 말하면 immutable은 메모리 주소에 저장된 내용을 변경할 수 없고 mutable은 메모리 주소에 저장된 내용을 변경할 수 있다는 개념이다
immutable value
- immutability란 객체가 생성된 이 후 해당 객체의 상태를 변경할 수 없다는 것을 의미한다. 조금 더 구체적으로 말하자면 메모리의 특정한 주소에 할당된 객체 값이 변경되면 안된다는 것이다
- 자바스크립트에서는 primitive type인 boolean, null, undefined, Number, String, Symbol 타입은 immutable 하다
mutable value
- primitive type 외의 모든 type은 mutable한 특성을 갖는다. mutable은 새로운 주소에 값이 생성되지 않고 이미 특정한 주소에 할당된 값이 변경 될 수 있다는 것을 의미한다
예시
let obj = {
name: 'john',
age: 12,
items: [1, 2, 3],
};
let objName = obj.name;
obj.name = 'tom';
let objItem = obj.items;
obj.items.push(4);
// String은 immutable 하기 때문에 objName의 내용은 변하지 않는다
objName; // 'john'
obj.name; // 'tom'
// Arrayy는 mutable 하기 때문에 objItem와 obj.items의 내용은 동일하다
objItem; // [1,2,3,4]
obj.items; // [1,2,3,4]
팁
- 객체를 사용할때 spread operator를 사용해 복사를 하면 객체의 immutability를 유지할 수 있다. 단 shallow copy만 가능함으로 nested 객체인 경우 deep copy를 해야지만 완벽한 immutability 유지가 가능하다
끝
- 자바스크립트에서 String은 immutable 하지만 c언어에서는 문자열이 배열처럼 mutable 한 특성을 가져 가끔 헷갈렸는데 immutability 개념을 알고난 뒤에는 더이상 헷갈리지 않을 것 같다
- immutable은 call by value, mutable은 call by reference가 처리 되는 것과 비슷하게 처리 되는 것 같다
- immutability에 대해 정리한 후 함수형 프로그래밍에 관심이 생겨 mastering javascript functional programming 책을 시간날때 한번 읽어봐야 겠다
😊