반응형
함수형 프로그래밍?
- 절차지향 프로그래밍,객체지향 프로그래밍, 함수형 프로그래밍 등을 '프로그래밍 패러다임'이라고 한다.
- 그 중 수학과 밀접하게 연관되어 함수의 사용을 메인컨셉으로 하는 것이 함수형 프로그래밍이다.
- 수학에서 주어진 데이터를 처리해 결과값을 도출하듯, 내외부 소통이 한정된 파이프라인(=함수)들을 묶어가며 프로그램을 구성해 나간다.
- Haskell, OCaml 등 함수형에 특화된 프로그래밍 언어도 있고
- 자바스크립트, 자바, 코틀린, Go, C++ 등 최근 객체지향과 더불어 함수형 프로그래밍 특징을 접목한 언어들도 많다.
프로그래밍 언어 역사와 함수형 프로그래밍
- 1958년 첫번째 함수형 프로그래밍 언어라고 할 수 있는 LISP가 등장했다.
- 우리가 보통 제일 처음으로 많이 배우는 프로그래밍 언어인 C보다도 일찍 등장한 것이다. (1972)
- 심지어 첫번째 객체지향형 프로그래밍 언어라고 할 수 있는 Simula(1962), Smalltalk(1972)보다도 더 먼저 등장했다.
- 기존에 함수형 프로그래밍이 주목받지 못했던 이유는 배우는데 시간이 좀 걸리고 난해하게 느껴질 수 있기 때문이었다. 따라서 사람의 사고방식과 가까운 절차지향, 객체지향 프로그래밍이 많이 사용되었다.
- 하지만 요즘 AI, IoT, 빅데이터, 블록체인 등이 떠오르면서 많은 데이터를 빠르게 병렬적으로 안정적으로 처리할 필요성이 생겼다. 그에 따라 이에 특화되었다고 할 수 있는 함수형 프로그래밍이 주목받게 된 것이다.
함수형 프로그래밍 특징
1. Pure Functions (순수함수)
// X
let num = 1;
function add(a) {
return a + num;
}
// O
function add(a,b) {
return a + b;
}
- 함수에서 외부의 상태값을 참조하거나 변경하는 것은 순수함수라고 볼 수 없다
- 동일한 인자를 넣었을 때 항상 동일한 결과를 반환하고
- 언제 선언이 되었는지 등의 요인을 포함하여 외부로부터 전혀 영향을 받아서는 안된다.
2. Stateless, Immutability (비상태, 불변성)
// X
let person = { name : 'ellie', age : 20 };
function increaseAge(person) {
person.age = person.age + 1;
return person;
}
// O
const person = Object.freeze({ name : 'ellie', age : 20 };)
function increaseAge(person) {
return {...person, age : person.age + 1};
}
- 함수에 인자로 전달된 것을 변경하는 것은 절대 함수형이 아니다.
- 새로운 버전의, 새로운 오브젝트를 만들어 결과로 전달해주어야 한다.
- 이런 제약으로 다른 side effect를 만들지 않기 때문에 여러가지 동시다발적인 멀티쓰레딩 환경에서도 안정적으로 동작할 수 있다.
- cf. Object.freeze : 불변성 데이터타입이 없는 자바스크립트에서 특정 오브젝트를 불변성으로 만들어주는 함수
3. Expressions Only
// X
let numbers = [1, 2, 3];
function multiply(numbers, multiplier) {
for (let i = 0; i < numbers.length; i++) {
numbers[i] = numbers[i] * multiplier;
}
}
// O
function multiply(numbers, multiplier) {
return numbers.map(num => num * multiplier);
}
- if, switch, for과 같은 statements을 사용하지 않고
- map과 같은 expressions로만 내용을 표현해야 한다.
4. First-class and higher-order functions
// First-class
const addTwo = a => a + 2;
const multiplyTwo = a => a * 2;
const transform = numbers => numbers.map(addTwo).map(multiplyTwo);
console.log(transform([1,2,3,4]);
// Higher-order
const addToppings = topping => food => food + topping;
const egg = addToppings('계란');
const bacon = addToppings('베이컨');
console.log(egg('피자'));
console.log(bacon('토스트'));
- 다른 데이터와 마찬가지로 함수가 변수에 할당되거나 함수에 인자로 전달되거나 리턴되는 등의 일들을 할 수 있는 First-class(고차함수) 특징과
- 함수 자체를 인자로 전달하거나 함수에서 또다른 함수를 리턴하는 higher-order(고차함수) 특징
- 둘 모두 가지고 있어야 한다.
객체지향 프로그래밍을 위해서는 캡슐화,상속,다형성 등의 개념뿐 아니라 디자인패턴까지 학습해야 했듯이 함수형 프로그래밍을 위해서도 Monad, Semigroup, Functor 등 다양한 컨셉들에 대한 이해를 필요로 한다. 특히 제일 핵심이라고 할 수 있는 Monad는 이해하기 매우 어렵기로 유명하다.
참고 : https://www.youtube.com/watch?v=4ezXhCuT2mw&list=PLcTre5kSvixpF0kPJFWaLR02ana5hBjmK&index=2&t=12s
반응형
'🛠 기타 > 개발상식' 카테고리의 다른 글
CI/CD란? (0) | 2021.07.17 |
---|---|
유데미(Udemy) 한글자막 undefined 해결 (21.07.15) (0) | 2021.07.15 |
명령형 UI와 선언형 UI (0) | 2021.05.02 |
SSH(Secure Shell Protocol) (0) | 2021.01.22 |
Linux - web server & apache (0) | 2021.01.22 |