[FP] 함수형 프로그래밍 간단 정리

yongkini ·2024년 4월 12일
0

Functional Programming

목록 보기
1/4
post-thumbnail

예시를 통해 개략적으로 살펴보기

예시

const isNumber = value => typeof value === 'number';
const checkNumber = arr => arr.every(isNumber); 
const sum = (x,y) => x + y;
const total = arr => arr.reduce(sum);
const length = arr => arr.length
const divide = (x,y) => x / y;
const average = (arr) => divide(total(arr), length(arr))
const errorOrNot = (isTrue, fn) => isTrue ?  fn : 'is error'; 

const value = [10, 20, 30, 40, 50, 60, 70];
errorOrNot(checkNumber(value), average(value)); // 40

const value2 = [10,20,30,'메롱'];
errorOrNot(checkNumber(value2), average(value2)); // 'is error'
  • 함수형 사고는 먼저 어떤 작업을 논리적 하위 작업들(= 함수)로 분할하는 행위로부터 시작된다.
    : 이 원리에 따라 '평균 값 구하기(배열이 모두 숫자라는 전제를 체크한 뒤에)'라는 간단한 작업을 논리적 하위 작업들로 나눠봤다. 이걸 일단 수도 코드로 표현해보면
    1) 배열 내의 값이 모두 숫자인지 체크한다.
    1) - 1 : 숫자가 아니면 'is error' 라는 string을 리턴한다.
    2) 배열 내의 값들을 모두 더한다.
    3) 배열의 길이를 얻는다.
    4) 두 값을 나눈다.
    이렇게 된다. 최대한 작업을 쪼개본 것으로 이해하면 된다.
    ** 단일성의 원리 : 함수는 저마다 한가지 목표만을 바라본다.
  • 그리고 함수형 프로그래밍에서는 부수 효과를 내는 함수를 쓰지 않고, 순수 함수를 쓰는 것을 지향한다. 따라서, 위의 함수들은 모두 외부 값을 참조하거나, 불변성을 해치지 않는다. 또한, 참조 투명성을 갖기 때문에 A라는 input을 넣으면 무조건 B가 나온다. 즉, 해당 함수에 A를 넣으면 무슨 일이 있어도 B가 나온다(순수 함수가 아니라면 C가 나올수도 있고, D가 나올 수 있음. 즉, 같은 input을 넣었음에도 부수 효과로 인해 output이 다를 수 있음).
  • 마지막으로, 선언적 프로그래밍을 지향한다. 본래 위에 평균 구하기를 절차 지향으로 표현해보면 다음과 같다.
const value = [10, 20, 30, 40, 50, 60, 70];

const getAverage = (arr) => {
	let total = 0;
    let len = arr.length;
	for(let i=0;i<arr.length;i++) {
    	if(typeof arr[i] !== 'number') return 'is error';
        total += arr[i];
    }
    
    return total / len;
}

getAverage(value); // 40

하지만, 선언적 프로그래밍은 이와 달리 하나하나 그 과정을 표현하기 보다는 위 과정을 한 단어의 함수 등으로 추상화 해서 표현한다(위에 표현해 놓은 함수형 프로그래밍 코드 처럼).

: 아직은 나도 함수형 프로그래밍의 장점이나 특징 등이 크게 와닿지는 않지만, 오늘 예시를 통해 배운 것은 함수형 사고를 하면 기획을 받았을 때, 혹은 어떤 대단위 기능을 만들 때 그 기능을 작은 작업 단위들(함수)로 쪼개서 작업을 할 수 있도록 해준다는 것이다(그리고 이렇게 생각의 단위를 너무 크게 하지 않고, 작은 단위부터 해나가면 생각이 좀 더 단순해지지 않을까 생각이 든다).

그리고, 그렇게 쪼갠 함수는 재사용하기도 좀 더 편하고(절차 지향에 비해서), 확장 시에도 해당 코드를 손대지 않고, 나중에 배울 compose 등의 함수형 프로그래밍 도구? 등을 써서 좀 더 쉽게 확장할 수 있다는 장점이 있을 것 같다(내가 함수형 프로그래밍에 관심을 갖게된 계기 이기도 하다 => 재사용과 확장성의 용이). 그리고 선언적인 프로그래밍이 아직은 파악이 절차 지향보다는 어렵지만, 적응이 되면 map, filter를 볼 때처럼 레거시 파악 등에도(함수형 프로그래밍으로 된 코드들) 더 용이할 것 같다는 생각이 든다(혹은 다른 사람의 코드를 볼 때).

마지막으로, 순수 함수를 사용함으로써 예측 가능한 코드 혹은 프로젝트를 유지할 수 있다는 점이 장점이 될 것 같다. 물론 타입스크립트 등을 써서 어느 정도 예측 가능한 코드를 만들 수 있지만, 함수형 프로그래밍의 장점으로 불변성, 순수 함수 등을 생각해보면 데이터와 관련해서 부수 효과가 없는 참조 투명한 함수들을 사용하여 코드를 작성하는 것은 예측 불가한 사항들을 어느정도 최대한 통제할 수 있다는게 되므로 그런 부분에 있어서 장점을 가져갈 수 있을 것 같다.

profile
완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

0개의 댓글