[딥다이브] + 함수형 프로그래밍, OOP

Dongs·2023년 4월 6일
0

[딥다이브]

목록 보기
11/11

번외

  • 딥다이브 스터디를 진행하며 서로 더 알고 싶었던 부분이나 헷갈렸던 부분을 더 자세히 조사해보고 공부해보는 시간을 가지게 되었다.

함수형 프로그래밍과 객체 지향 프로그래밍

  • 솔직히 이론만 봐서는 함수형 프로그래밍과 객체 지향 프로그래밍이 각각 어디에 쓰이는지, 어떤 차이점이 있는지 그리고 어떤 로직에 더 효과적인지.. 상황 자체를 몰라 너무 답답했었다... 그래서 더욱 자세히 알아보게 되었다!

함수형 프로그래밍

  • 함수형 프로그래밍은 함수를 중심으로 코드를 구성하고 함수는 입력값을 받아서 출력값을 반환하는 작은 단위로 쪼개어 작성하고, 이러한 작은 함수들을 조합하여 더 큰 함수를 만들어나가는 방식이다. 함수형 프로그래밍에서는 상태를 변경하는 것보다는 입력값과 출력값의 관계에 집중하며, 이러한 방식은 코드의 복잡성을 낮추고 테스트하기 쉬운 코드를 만들어낸다. 함수형 프로그래밍은 병렬처리에 유리하고, 작은 단위로 쪼개어 작성하므로 유지보수가 쉽다.

병렬처리

  • 병렬처리는 하나의 작업을 여러 개의 작은 작업으로 분할하고, 각각의 작은 작업을 동시에 처리함으로써 전체 작업을 보다 빠르게 처리하는 방식이다. 이는 CPU 코어의 개수가 늘어남에 따라 실행 시간을 더욱 줄일 수 있다. 따라서 대용량 데이터 처리 등과 같이 처리 속도가 중요한 작업에서 많이 사용된다.

결론

  • 자바스크립트는 싱글스레드 언어이다. 그럼 시간이 걸리는 로직을 만나도 그 로직을 끝내기 전까진 기다려야 한다. 그러나, setTimeout, Promise, async/await 같은 비동기 함수를 지원함으로써 비동기 처리를 가능하게 함으로써 데이터 병렬처리와 cpu시간을 효율적으로 사용할 수 있게 되었다는 것이다.

왜 FP가 OOP 보다 병렬처리가 쉬운 것일까?

  • 함수형 프로그래밍에서는 상태를 변경하지 않고 순수 함수를 사용하여 병렬처리가 쉽다.
    이는 함수형 프로그래밍이 상태를 변경하지 않고 데이터를 처리하므로 다른 스레드나 프로세스에서 동일한 함수를 실행하여 데이터를 병렬 처리하기가 쉬워지기 때문이다.
    함수형 프로그래밍은 기존 값을 변경하는 것이 아닌 매개변수로 인자를 넘길 때 마다 새로운 값으로 반환, 즉, 불변성을 유지하기 때문에 병렬처리 시에 발생할 수 있는 데이터 경합이나 동기화 문제를 피할 수 있다.

  • 반면 객체 지향 프로그래밍은?
    객체의 상태를 변경하는 방식으로 데이터를 처리하기 때문에 동시에 여러 객체를 조작하거나 동일한 객체의 메소드를 여러 개의 스레드에서 호출할 때 문제가 발생할 수 있다. 이러한 문제를 해결하기 위해서는 복잡한 동기화 메커니즘이 필요하다고 한다.


객체지향 프로그래밍(OOP)

  • 객체지향 프로그래밍은 객체를 중심으로 코드를 구성한다. 객체는 상태(state)행동(behavior) 으로 구성되며, 객체지향 프로그래밍에서는 이러한 객체를 생성하고 조작하는 방식으로 코드를 작성한다. 객체지향 프로그래밍에서는 상속과 다형성 등의 개념을 이용하여 코드를 재사용하고, 객체의 관계를 표현하여 코드의 유연성을 높인다. 객체지향 프로그래밍은 대규모 프로젝트에 유용하며, 코드의 재사용성이 높아 코드의 양을 줄일 수 있다.

코드 예시

fp

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
  • 외부의 값을 변경하는 사항이 없다. 순수 함수를 이용한 함수형 프로그래밍 이다.

oop

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
  • 위의 makeCounter 함수를 변수 counter에 호출하며 할당시켜주었다. 이 때 makeCounter 함수는 각각 increase와 decrease 프로퍼티 즉 메서드를 반환하고 있다.
console.log(counter) // {increase: ƒ, decrease: ƒ}

makeCounter 내의 count 변수는 외부에서 접근할 수 없고, 또한 이 함수는 increase와 decrease 함수에 의해 count 값이 변경되는 클로저 함수, 그리고 이 변수는 캡슐화, 은닉 되었다고 말할 수 있다.

결론

  • 상태 값을 처리하는 코드는 oop가 더 직관적인 것 같다.
profile
자대고 css 하는 프론트엔드 개발자

0개의 댓글