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

keyPoint

  • 함수형 프로그래밍에서 불변 데이터가 필요하다. 계산에서는 변경 가능한 데이터에 쓰기를 할 수 없다.
  • 카피-온-라이트는 데이터를 불변형으로 유지할 수 있는 원칙이다. 복사본을 만들고 원본 대신 복사본을 변경하는 것을 말한다.
  • 카피-온-라이트는 값을 변경하기 전에 얕은 복사를 한다. 그리고 리턴한다. 이렇게 하면 통제할 수 있는 범위에서 불변성을 구현할 수 있다.
  • 보일러 플레이트 코드(boilerplate code)를 줄이기 위해 기본적인 배열과 객체 동작에 대한 카피-온-라이트 버전을 만들어 두는 것이 좋다.
    • 보일러 플레이트 코드 : 여러 곳에서 비슷한 코드가 반복되는 것

Question

p.111 하스켈이나 클로저 같은 언어도 카피-온-라이트 원칙을 쓰고 있습니다.

p.133 클로저에서 지원하는 불변 데이터 구조는 다른 언어에서 참고할 만큼 효율적입니다.

→ 클로저의 카피-온-라이트 원칙, 불변 데이터 구조

클로저 (opens in a new tab)

  • 자신을 포함하고 있는 외부함수보다 내부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는 함수
  • 반환된 내부함수가 자신이 선언됐을 때의 환경(lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수
  • 자신이 생성될 때의 환경을 기억하는 함수

클로저의 데이터 불변성

<!DOCTYPE html>
<html>
  <body>
  <p>클로저를 사용한 Counting</p>
  <button id="inclease">+</button>
  <p id="count">0</p>
  <script>
    var increaseBtn = document.getElementById('increase');
    var count = document.getElementById('count');
 
    var increase = (function () {
      // 카운트 상태를 유지하기 위한 자유 변수
      var counter = 0;
      // 클로저를 반환
      return function () {
        return ++counter;
      };
    }());
 
    incleaseBtn.onclick = function () {
      count.innerHTML = increase();
    };
  </script>
</body>
</html>
  • 스크립트 실행 시 즉시실행함수 호출 → 변수 increase에 function () { return ++counter; }가 할당됨 (클로저) → 클로저는 자신이 선언됐을 때의 즉시실행함수의 지역 변수였던 counter를 기억함 ⇒ 즉시실행함수의 변수 counter에 접근 가능 ⇒ 변수 counter는 자신을 참조하는 함수가 소멸될 때까지 유지됨
  • 즉시실행함수는 한 번만 실행되므로 increase가 호출될 때마다 counter가 초기화될 일은 없음 ⇒ 의도치 않은 변경을 피함 ⇒ 상태 변경이나 가변 데이터를 피하고 불변성을 지향하는 함수형 프로그래밍에서 부수 효과를 최대한 억제하여 오류를 피하고 프로그램의 안정성을 높이기 위해 적극 사용됨