쏙쏙 들어오는 함수형 코딩 Chapter 6
🖍 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기
이 글은 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기를 읽고 작성한 글입니다. 함수형도 함수형이지만, 이 책을 통해 좀더 깔끔하고 직관적인 코드를 작성할 수 있을 것이란 팀원들의 의견을 토대로 이번 스터디 서적으로 선정하였습니다.
Chap 6. 변경 가능한 데이터 구조를 가진 언어에서 불변성 유지하기(feat. JS)
- 데이터가 바뀌지 않도록
카피-온-라이트
적용하기 - 깊이 중첩된 데이터에도
카피-온-라이트
적용하기 불변성
이해하기
1) 동작을 읽기, 쓰기 혹은 둘 다로 분류하기
읽기(Read)
: 데이터를 바꾸지 않고 정보를 꺼내는 것- 인자에만 의존해서 정보를 가져오는 읽기는
순수 함수
즉,계산
이 된다.
- 인자에만 의존해서 정보를 가져오는 읽기는
쓰기(Write)
: 데이터를 바꾸는 것- 변경되는 데이터가 어디에서 사용될지 알 수 없기 때문에
불변성 원칙(카피-온-라이트)
이 필요하다.
- 변경되는 데이터가 어디에서 사용될지 알 수 없기 때문에
읽기와 쓰기 둘 다
: 데이터를 바꾸면서 정보를 꺼내는 것
2) 카피-온-라이트 원칙 세 단계
- 복사본 만들기
- 복사본 변경하기
- 복사본 반환하기
2-1) 배열의 카피-온-라이트
- push() 예시
const getAddedArray = (array, value) => { const newArray = [...array]; newArray.push(value); return newArray; }; const array = [1, 2, 3]; const newArray = getAddedArray(array, 4); // [1, 2, 3, 4]
2-2) 객체의 카피-온-라이트
- Object.assign() 예시
const getAddedObject = (object, value) => { const newObject = Object.assign({}, object); newObject.value = value; return newObject; };
3) 불변 데이터 구조를 읽는 것은 계산이다.
- 변경 가능한 데이터를 읽는 것 =>
액션
쓰기
는 데이터를 변경 가능한 구조로 만든다.- 어떤 데이터에
쓰기가 없다면
그 데이터는불변 데이터
이다. - 불변 데이터를 읽는 것 =>
계산
쓰기
를읽기
로 바꾸면액션
은 줄고계산
이 많아진다.
4) 불변성도 좋지만, 당연히 변경 가능한 데이터는 필요하다.
ex) 장바구니가 변경 가능하지 않다면, 장바구니에 물건을 담을 수 없다.
5) 불변 데이터는 느리지 않다.
일반적으로 불변 데이터를 만드는 건, 기존 데이터를 변경하는 것보다는 더 많은 메모리를 사용하고 느리다.
다만,
- 느린 부분은 언제든 최적화가 가능하다.
- 현대 대부분의 언어의 가비지 컬렉터는 불변 데이터를 처리하는 데 최적화되어 있다.
- 우리의 생각보다 많이 복사하지 않는다.
- ex) [1, 2, 3, ..., 100]이란 배열을 복사 => 1부터 100까지의 숫자는 이미 메모리에 존재하기 때문에 복사하지 않는다. 단지 배열의 참조만 복사한다.(100개의 숫자를 복사할 것 같지만, 아니라는 이야기)
6) 정리
- 함수형 프로그래밍에서
불변 데이터
는 필요하다. - 변경 가능한 데이터에 쓰기를 하는 것은
계산
이 아니라액션
이다. 카피-온-라이트
: 데이터를 불변형으로 유지할 수 있는 원칙. 즉, 복사본을 만들고 복사본을 변경한 후 복사본을 반환하는 것.
중첩 데이터(nested data): 데이터 구조 안에 데이터 구조가 있는 데이터<br/> 얕은 복사(shallow copy): 데이터 구조 안에 있는 데이터 구조는 복사하지 않고 참조만 복사하는 것(최상위 데이터 구조만 복사한다.)<br/> 구조적 공유(structural sharing): 두 개의 중첩된 데이터 구조에서 그 내부 데이터가 같은 데이터를 참조하는 경우
undefined