여러가지 의미로 함수형 프로글밍이라는 개념은 프로그래밍 그 자체보다 앞서 등장했다고 한다.
함수형 프로그램을 직접적으로 지원하는 언어가 존재한다. 클로저 언어와 함수형 프로그래밍을 보다 자세힌 다루지 않는다.
( 클로저.. ?? 롤 프로게이머 ㅎ.. 나아중에 알아보도록 하자 )
자바는 가변변수 ( mutable variable ) 을 사용하는데 이는 즉 프로그램이 실행 중에 상태가 변할 수 있다는 것 이다 ( 예를들어 for 문의 i 값 같은 경우 )
하지만 클로저 프로그램에는 가변 변수가 전혀 존재하지 않는다.
왜 이러한 불변성이 중요할까? 경합 ( Race ), 조건 , 교착상태 ( Deadlock ), 동시 업데이트 ( Concurrent update ) 해당 문제들은 모두 가변 변수로 인해 발생한다고 한다..!
( 헉..! 진짜 맞말… 이중 아는건 데드락 밖에 없지만 ,,, )
다시 말해 동시성 애플리케이션에서 마주치는 모든 문제 , 즉 다수의 스레드와 프로세스를 사용하는 애플리케이션에서 마주치는 모든 문제는 가변 변수가 없다면 절대로 생기지 않는다..!
그렇다면 불변성을 정말 실현 가능할까??? 물론 가능하지만 저장 공간이 무한대가 아니라면 일종의 타협을 해야 한다.
타협 중 하나는 애플리케이션 또는 내부의 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 일이다.
불변 컴포넌트에서는 어떠한 가변 변수도 사용되지 않으며 변수의 상태를 변경할 수 있는 순수 함수형 컴포넌트가 아닌 하나 이상의 다른 컴포넌트와 서로 통신한다..?
( ㅇㅁㅇ.. 무슨 말이지 감이 안잡히네.. 가변 변수를 안 쓸수가 있나.. ? )
상태 변경은 컴포넌트를 갖가지 동시성 문제에 노출하는 꼴이라서 트랜잭션 메모리 Transctional Memory 와 같은 실천법을 사용해서 동시 업데이트와 경합 조건 문제로부터 가변 변수를 보호한다고 한다.
( ㅇ..아하.. 그.. 그렇군요.. 완벽히.. 이해했어… 아마 클로저 언어를 공부해야 좀 이해가 쉬울듯 )
아무튼! 애플리케이션을 제대로 구조화 하려면 불변 컴포넌트와 가변 컴포넌트를 분리해야 하며 이를 위해서는 가변 변수들을 보호하는 적절한 수단을 동원해서 뒷받침 해야한다.
현명한 아키텍트라면 가능한 한 많은 처리를 불변 컴포넌트로 옮겨야 하고 , 가변 컴포넌트에서는 가능한 한 많은 코드를 빼내야 한다.
저장 공간과 처리 능력의 한계는 우리의 시야에서 급격히 사라지고 있으며 더 많은 메모리를 확보할수록, 기계가 더 빨라질수록 , 필요한 가변 상태는 더 적어진다.
은행 어플을 생각해보자 , 이 어플에서는 입금 트랜잭션과 출금 트랜잭션이 실행되면 잔고를 변경해야 한다