✨ 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로 함수형 장바구니 구현
원리는 다음 단계를 거친다.
- 사용자 정보를 담고 있는 consumer 객체를 대상으로 진행한다.
- 장바구니에 빵을 담는 함수, 장바구니에 있는 빵을 구매하는 함수를 새로운 사용자 객체를 돌려주는 순수함수로 구현한다.
- 이에 대한 합성함수를 만들어 하나의 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: [ '앙버터', '소금빵' ] }
🌈 정리
함수형 프로그래밍을 사용하면, 여러개의 순수함수들을 조합하여 하나의 비즈니스적인 로직을 구현할 수 있다.
더불어 각각의 순수 함수들을 재사용하여 다른 프로그램에서도 적용할 수 있다는 것이 특징이다.
📚 참고자료
'Computer > Design-Pattern' 카테고리의 다른 글
OOP (Object-Oriented Programming) (0) | 2023.02.28 |
---|---|
MVC Pattern (0) | 2023.02.22 |