함수형 프로그래밍
📖 들어가기
최근에 면접질문으로 함수형 프로그래밍에대해 아는지 질문을 받았다.
어렴풋이 들어는 봤지만 정확하게 알지는 못하는 내용, 내가 사용하려고 노력은 하지만 정확한 정의를 알지못한채 사용하는 기법.
나는 제대로 설명할 수 없었고, 원하는 대답을 내놓지 못했다.
뭔가 굉장히 부끄러웠다. 내가 지향하는 프로그래밍 기법인데 그것을 잘 모른채 사용하고 있었다는것이 그래서 오늘은 함수형 프로그래밍에대해 공부하고 그 내용을 정리해 볼까한다.
- 함수형 프로그래밍이란 어떤것인지?
- 명령형 vs 선언형 프로그래밍 비교
- 함수형 프로그래밍을 사용하는데 필요한 개념
- 구현 방법
함수형 프로그래밍이란?
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변데이터를 멀리하는 프로그래밍 패러다임의 하나이다.
조금 풀어서 설명하자면 계산을 수학적 함수의 조합으로 생각하는 방식이다. 이것은 일반적인 프로그래밍 언어에서 함수가 특정 동작을 수행하는 역할을 담당하는 것과는 반대되는 개념으로, 함수를 수행해도 함수 외부의 값은 변경될 수 없다.
결국 함수형 프로그래밍이란 새로운 것을 배우는것이 아닌, 함수로 프로그래밍의 사고를 배우는 것이다.
명령형 프로그래밍 VS 선언형 프로그래밍
명령형 프로그래밍
상태를 바꾸는 것을 강조하는 것, 명령형의 함수는 프로그램의 상태의 값을 바꿀 수 있는 부작용이 생길 수 있다. 이 때문에 명령형 함수는 참조 투명성이 없고, 같은 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값을 낼 수 있다.
알고리즘을 명시, 목표는 명시하지 않음 (HOW)
- 절차지향 프로그래밍
- 객체지향 프로그래밍
선언형 프로그래밍
알고리즘 명시하지 않음, 목표만 명시 (WHAT)
순수 함수 or 람다 계산식
필요한 개념
1급 객체(First Object)
- 변수나 데이터 구조에 담을 수 있음
- 파라미터 전달 가능
- 리턴값을 사용 할 수 있음
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능
- 동적으로 프로퍼티 할당이 가능
자스에서 함수는 객체이므로 1급 객체에 해당된다.
고차함수(High order Function)
람다 계산법에서 만들어진 용어로 아래 조건을 만족해야함
- 함수에 함수를 파라미터로 전달할 수 있음
- 함수의 반환값을 함수로 지정할 수 있음
불변성
- 함수형 프로그래밍에서 데이터가 변할 수 없는데 이를 불변성 데이터라고함
- 데이터변경이 필요한 경우, 원본 데이터를 변경하지않고 그 데이터를 복사본으로 만들어 일부를 변경하고 변경된 복사본을 사용해 작업을 진행
순수함수 (Pure Function)
- 함수형 프로그래밍에 필요한 개념
- 동일한 입력에는 항상 같은 값이 리턴됨
- 함수의 실행은 프로그램 실행에 영향이 없어야함 (side effect ❌)
=> 데스트 하기가 쉬움
const header = (props) => <h1>{props.title}</h1>
// DOM생성 라인은 다른 펑션으로 이동
// DOM을 변경하는 책임은 애플리케이션의 다른 부분이 담당하도록 해야한다.
합성 함수(Function composition) : 커링함수
- 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합
- 메서드 체이닝: 순수함수를 연쇄적으로 호출 or 병렬적으로 호출하여 더 큰 함수를 만드는 과정으로 프로그램을 구축
커링함수란?
여러개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인형태로 구성하는 것
- 커링 함수는 한번에 하나의 인자만 전달하는것을 원칙
- 중간 과정상의 함수를 실행한 결과는 다음 인자를 받기 위해 대기
- 마지막 인자가 전달 되기 전까지 원본 함수가 실행이 안됨
간단한 예시
>const curry => func => a => b => c => d => e => func(a,b,c,d,e)
orcurry(a)(b)(b)(d)(e)
구현 방법 및 정리
- 함수형 프로그래밍은 명령형이 아닌 선언형이며 애플리케이션의 상태는 순수 함수를 통해 전달.
- 순수 함수를 조합하고 공유 상태(참조), 변경 가능한 데이터 및 부작용을 피하며 소프트웨어를 만드는 프로세스 또는 프로그래밍 기법.
참조