충분히 쌓여가는
함수형 프로그래밍 본문
함수형 프로그래밍: 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식
자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미함
함수형 프로그래밍을 배우는 것은 다른 방식으로 사고하는 법을 배우는 것
함수형 언어로 설계된 언어
- 클로저, 스칼라, 하스켈
- 자바스크립트, 코틀린, 파이썬 => 최근 버전에 함수형 프로그래밍 문법 추가
함수형 프로그래밍 특징
1. pure function 순수 함수
- 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
- 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
- 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
순수 함수는 프로그램의 변화 없이 입력 값에 대한 결과를 예상 할 수 있어 테스트 용이함
순수함수 아닌 것
let num = 1;
function add(a) {
return a + num;
}
- add라는 함수 안에서 전역으로 선언된 변수인 num을 참조하기 때문에 순수함수라고 볼 수 없다.
순수함수인 것
function add(a, b) {
return a + b;
}
const result = add(2, 3);
- add의 함수가 프로그램 실행에 영향을 미치지 않고 입력 값에 대해서만 값의 변환이 있으므로 순수함수
2. Stateless, Immutability 비상태, 불변성
- 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 함
- 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행
불변성 불만족
let person = { name: "jongmin", age: "26" };
function increaseAge(person) {
person.age = person.age + 1;
return person;
}
- increaseAge 함수에서 전역으로 선언된 person의 age 속성을 변경하므로 불변성 유지를 만족하지 못함
let: 중복선언 불가. 재할당 가능
불변성 만족
// 비상태, 불변성 만족
const person = { name: "jongmin", age: "26" };
function increaseAge(person) {
return { ...person, age: person.age + 1 };
}
- 객체의 값을 바꾸기 위해 데이터의 복사본을 만들어, 그 복사본을 사용해 작업을 진행하고 반환
const: 중복선언 불가. 재할당 불가
3. Expressions 선언형 함수
- 명령형 프로그래밍: 어떻게 할 것인가, 그 결과값에 어떻게 도달하느냐에 관한 것
- 선언형 프로그래밍: 무엇을 할 것인가, 원하는 결과값을 선언하는 것
for문을 사용해 배열의 각 요소에 multiplier을 곱해주는 명령형 프로그래밍
let numbers = [1, 2, 3];
function multiply(numbers, multiplier) {
for (let i = 0; i < numbers.length; i++) {
numbers[i] = numbes[i] * multiplier;
}
}
- 요구사항에 충족하는데 필요한 모든 단계를 하나씩 적음
선언형 프로그래밍
function multiply(number, multiplier) {
return number.map((num) => num * multiplier);
}
- 함수형 프로그래밍에서 if,switch, for 등 명령문을 사용하지 않고 함수형 코드로 작성
- for문을 map으로 대치함
4. Fist-class. Higher-order functions 1급 객체와 고차함수
1급 객체 특징
- 변수나 데이터 구조안에 담을 수 있음
- 파라미터로 전달 할 수 있음
- 반환값(return value)으로 사용할 수 있음
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능
- 동적으로 프로퍼티 할당이 가능
프로퍼티(property): 객체 안에 선언된 이름과 값으로 이루어진 한 쌍을 의미
1급 객체
const addTwo = (num) => num + 2;
const multiplyTwo = (num) => num * 2;
const transform = (numbers) => numbers.map(addTwo).map(multiplyTwo);
console.log(transform([1, 2, 3, 4])); // [6, 8, 10, 12]
- 함수를 변수에 할당하거나 반환하는 예시
고차함수
- 함수를 인자로써 전달 할 수 있어야 함
- 함수의 반환 값으로 또 다른 함수를 사용 할 수 있음
const addInform = (name) => (age) => age + name;
const jongmin = addInform("부산");
console.log(jongmin("051")); // 051부산
- 함수의 반환 값으로 다른 함수를 사용하거나, 함수의 반환 값으로 또 다른 함수를 사용 할 수 있어야 함
함수형 프로그래밍 장점
- 높은 수준의 추상화를 제공
- 함수 단위의 코드 재사용이 수월함
- 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워짐
함수형 프로그래밍 단점
- 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있음
- 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있음
- 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않음
참고 자료
얄팍한 코딩사전, 함수형 프로그래밍이 뭔가요?
노마드 코더, 연봉이 떡상한다고? 함수형 프로그래밍! 10분만에 이해하기.
jongminfire.dev, 함수형 프로그래밍이란?
'IT > Computer Science' 카테고리의 다른 글
cookie / session / token / cache / CDN (1) | 2023.02.08 |
---|---|
IPC(Inter Process Communication) (1) | 2023.02.06 |
GET방식 / POST 방식 (0) | 2023.02.03 |
Normalization 정규화 (0) | 2023.02.02 |
Agile 애자일 (0) | 2023.02.01 |