함수형 프로그래밍에서는 상태를 변경하지 않고 순수 함수를 사용하여 병렬처리가 쉽다.
이는 함수형 프로그래밍이 상태를 변경하지 않고 데이터를 처리하므로 다른 스레드나 프로세스에서 동일한 함수를 실행하여 데이터를 병렬 처리하기가 쉬워지기 때문이다.
함수형 프로그래밍은 기존 값을 변경하는 것이 아닌 매개변수로 인자를 넘길 때 마다 새로운 값으로 반환, 즉, 불변성을 유지하기 때문에 병렬처리 시에 발생할 수 있는 데이터 경합이나 동기화 문제를 피할 수 있다.
반면 객체 지향 프로그래밍은?
객체의 상태를 변경하는 방식으로 데이터를 처리하기 때문에 동시에 여러 객체를 조작하거나 동일한 객체의 메소드를 여러 개의 스레드에서 호출할 때 문제가 발생할 수 있다. 이러한 문제를 해결하기 위해서는 복잡한 동기화 메커니즘이 필요하다고 한다.
const add = x => y => x + y;
const calculate = add(0);
const result = calculate(2);
const calculate2 = add(result);
const result2 = calculate(3);
console.log(result); //2
console.log(result2); //5
class Calculator {
constructor() {
this.value = 0;
}
add(number) {
this.value += number;
}
getValue() {
return this.value;
}
}
const calculator = new Calculator();
calculator.add(2);
calculator.add(3);
console.log(calculator.getValue()); // 5
constructor
내의 this.value 값이 calculator
인스턴스 객체 내의 this로 바인딩 된다.
위와 같이 calculator.add(2); calculator.add(3);
처럼 add 메서드에 2와 3을 각각 넘겨주면 상태값(this)이 누적되어 getValue 메서드를 호출하면 5가 나오게 된다.
반면에 함수형 프로그래밍은 매번 새로운 반환 값을 반환한다. 위와 같이 상태관리를 하려면 클로저를 이용하여 변수를 캡슐화 해줘야 한다.
function makeCounter() {
var count = 0;
function increase() {
count++;
console.log(count);
}
function decrease() {
count--;
console.log(count);
}
return {
increase: increase,
decrease: decrease
}
}
var counter = makeCounter();
counter.increase(); // 1
counter.increase(); // 2
counter.decrease(); // 1
console.log(counter) // {increase: ƒ, decrease: ƒ}
makeCounter 내의 count 변수는 외부에서 접근할 수 없고, 또한 이 함수는 increase와 decrease 함수에 의해 count 값이 변경되는 클로저 함수, 그리고 이 변수는 캡슐화, 은닉 되었다고 말할 수 있다.