정수를 제곱하기
- 25까지의 정수의 제곱을 출력하는 간단한 문제를 보자
- 자바 언어
- 리스프에서 파생한 클로저(Clojure)
- 위의 코드를 좀 더 풀어쓰고 주석 작성
- 클로저와 자바 프로그램 사이의 극단적인 차이가 있다
- 자바 프로그램은 가변 변수를 사용하는데, 프로그램 실행 중에 상태가 변할 수 있다. 앞의 예제에서 반복문을 제어하는 변수가 i.
- 클로저 프로그램에서는 가변 변수가 없고, x와 같은 변수가 한번 초기화되면 절대 변하지 않는다
- 함수형 언어에는 변수는 변경되지 않는다
불변성과 아키텍처
- 아키텍트가 변수의 가변성을 염려하는 이유
- 경합 조건
- 교착상태 조건(락이 가변적이지 않다면 교착상태도 일어나지 않는다)
- 동시 업데이트 문제
- 동시성 애플리케이션에서 마주치는 모든 문제, 즉 다수의 스레드와 프로세스를 사용하는 애플리케이션에서 마주치는 모든 문제는 가변 변수가 없다면 절대 생기지 않는다
- 아키텍트라면 동시성 문제에 지대한 관심을 가져야 한다
- 스레드와 프로세스가 여러 개인 상황에서도 설계한 시스템이 여전히 강건하기를 바란다
- 저장 공간이 무한하고 프로세스의 속도가 무한히 빠르다면 불변성의 실현 가능성에 대해 긍정적이지만, 그렇지 않다면 미묘하다
- 불변성은 실현 가능하겠지만 일종의 타협을 해야 한다
가변성의 분리
- 불변성과 관련하여 가장 주요한 타협 중 하나는 애플리케이션 or 그 내부의 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 일
- 불변 컴포넌트에서는 순수하게 함수형 방식으로만 작업이 처리되며, 어떤 가변 변수도 사용되지 않는다
- 불변 컴포넌트는 변수의 상태를 변경할 수 있는, 즉 순수 함수형 컴포넌트가 아닌 하나 이상의 다른 컴포넌트와 서로 통신