favicon

Jayden { do: smite }

쏙쏙 들어오는 함수형 코딩 Chapter 6

🖍 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기

이 글은 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기를 읽고 작성한 글입니다. 함수형도 함수형이지만, 이 책을 통해 좀더 깔끔하고 직관적인 코드를 작성할 수 있을 것이란 팀원들의 의견을 토대로 이번 스터디 서적으로 선정하였습니다.

Chap 6. 변경 가능한 데이터 구조를 가진 언어에서 불변성 유지하기(feat. JS)

  • 데이터가 바뀌지 않도록 카피-온-라이트 적용하기
  • 깊이 중첩된 데이터에도 카피-온-라이트 적용하기
  • 불변성 이해하기

1) 동작을 읽기, 쓰기 혹은 둘 다로 분류하기

  • 읽기(Read): 데이터를 바꾸지 않고 정보를 꺼내는 것
    • 인자에만 의존해서 정보를 가져오는 읽기는 순수 함수 즉, 계산이 된다.
  • 쓰기(Write): 데이터를 바꾸는 것
    • 변경되는 데이터가 어디에서 사용될지 알 수 없기 때문에 불변성 원칙(카피-온-라이트)이 필요하다.
  • 읽기와 쓰기 둘 다: 데이터를 바꾸면서 정보를 꺼내는 것

2) 카피-온-라이트 원칙 세 단계

  1. 복사본 만들기
  2. 복사본 변경하기
  3. 복사본 반환하기

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

Copyright 2023. all rights reserved by Jayden