Computer/Design-Pattern

Declarative 👉 Functional

Happhee.dev 2023. 2. 28. 17:27


✨ Programming Paradigm

프로그래밍 패러다임은 프로그래머에게 어떤 관점으로 코드를 어떻게 작성할 지에 대한 방향성을 잡아주는 개념이다.


우리는 새로운 프로그래밍 패러다임을 통해 새로운 방식으로 코드를 작성하는 능력을 길러 낼 수 있다.

여기서 등장한 개념이 명령형 프로그래밍과 선언형 프로그래밍이다.

Imperative programming is like how you do something, and declarative programming is more like what you do, or something.

✅ 명령형 프로그래밍

How에 초점이 맞춰져 있는 프로그래밍 방식이다.

 

예를 들면...!

 

" 우리집에서 학교를 가려면, 집에서 나와 우회전을 하고 10번출구가 나올 때까지 직진하세요.
그리고 롯데마트 건물이 있는 곳으로 신호등을 건너서 다시 우회전을 해서 직진하면 됩니다. "

 

위의 말처럼 과정을 담게 되는 것이 바로 명령형 프로그래밍이다.
종류는 2가지이다.

  • 절차지향 프로그래밍
    👉 순차적인 처리 과정을 포함하는 방식
  • 객체지향 프로그래밍
    👉 객체들의 집합으로 프로그램의 상호작용을 표현하는 방식

✅ 선언형 프로그래밍

What에 초점이 맞춰져 있는 프로그래밍 방식이다.

 

명령형 프로그래밍을 선언형 프로그래밍으로 바꿔보면 아래와 같다...!

"학교의 주소는 솝트시 웹동 32-03번지입니다."

 

차이를 크게 느낄 수 있다.


종류는 1가지 이다.

  • 함수형 프로그래밍
    👉 순수 함수를 조합하고 소프트웨어를 만드는 방식

🤔 함수형 프로그래밍은 왜 등장했을까?

개발자들은 과정을 나타내는 명령형 프로그래밍으로 방대해지는 소프트웨어를 개발하는데, 큰 어려움을 느끼게 되었다.
그래서 등장한 개념이 함수형 프로그래밍이었다.

 

순수함수로 작성했기에 문제를 해결할 뿐만 아니라 가독성을 높이고, 유지보수도 용이하게 해주는 장점이 생기게 된다.


✨ 함수형 프로그래밍의 특징

✅ 순수함수

들어온 인자가 같으면 결과가 항상 같은 함수이다.

즉, 받은 인자 외에 다른 외부의 상태에 영향을 끼치않고 리턴값 외에는 외부와 소통이 없다는 것이다.


아래의 코드로 이해해보자.

const addSum = (a, b) => {
  return a + b;
}

a,b의 값이 동일하다면 addSum의 반환값이 동일하기에 순수함수로 볼 수 있다.

  • Memory or I/O의 관점에서 Side Effect가 없는 함수
  • 함수의 실행이 외부에 영향을 끼치지 않는 함수

✅ Side Effect

아래의 변화 또는 변화를 일으키는 작업이 바로 부수효과이다.

  • 변수의 값이 변경
  • 자료 구조를 제자리에서 수정
  • 객체의 필드값을 설정
  • 콘솔 또는 파일 I/O가 발생

🖥 JavaScript로 함수형 장바구니 구현

원리는 다음 단계를 거친다.

  1. 사용자 정보를 담고 있는 consumer 객체를 대상으로 진행한다.
  2. 장바구니에 빵을 담는 함수, 장바구니에 있는 빵을 구매하는 함수를 새로운 사용자 객체를 돌려주는 순수함수로 구현한다.
  3. 이에 대한 합성함수를 만들어 하나의 task로 구현한다.
// ✅ 사용자 객체
const consumer = {
  name: "seohee",
  age: 24,
  cart: ["앙버터"],
  purchaseBread: [],
};

// ✅ Object.assign으로 새로운 객체를 반환
const addCartToConsumer = (consumer, breadItem) => {
  const newCart = [...consumer.cart, breadItem];
  return Object.assign({}, consumer, { cart: newCart });
};
// ✅ Object.assign으로 새로운 객체를 반환
const addPurchaseBread = (consumer) => {
  const newPurchaseBread = [...consumer.purchaseBread, ...consumer.cart];
  return Object.assign({}, consumer, {
    cart: [],
    purchaseBread: newPurchaseBread,
  });
};
// ✅ 합성함수로 제작
const composeFunction = (f, g) => (consumer, breadItem) =>
  f(g(consumer, breadItem));

const buyBread = composeFunction(addPurchaseBread, addCartToConsumer);
// ✨ 하나의 Task로 구현
console.log(buyBread(consumer, "소금빵")); // { name: 'seohee', age: 24, cart: [], purchaseBread: [ '앙버터', '소금빵' ] }

🌈 정리

함수형 프로그래밍을 사용하면, 여러개의 순수함수들을 조합하여 하나의 비즈니스적인 로직을 구현할 수 있다.
더불어 각각의 순수 함수들을 재사용하여 다른 프로그램에서도 적용할 수 있다는 것이 특징이다.


📚 참고자료