서론
함수형 프로그래밍은 패러다임중의 하나이다. 프로그램이 어떻게 동작해야 할지 일일히 명시하는 명령형 프로그램과 다르게 프로그램의 결과만을 입력하는 선언적 프로그램을 만드는 패러다임이다.
자바스크립트는 세가지 특징때문에 함수형 프로그래밍을 쓰기 편하다. 첫째로 클로저를 통해 외부 변수를 쉽게 참조할 수 있으며, 둘째로 1급 객체로서 함수를 값처럼 사용할 수 있어 코드의 유연성과 재사용성을 높인다. 마지막으로 모나드의 일종인 Promise를 통해 비동기 작업을 체계적으로 처리할 수 있다. 이러한 특징들은 JavaScript를 함수형 패러다임에 매우 적합한 언어로 만든다. 이를 통해 순수 함수로 부작용을 방지하고 불변성을 유지할 수 있어 코드의 안정성과 예측 가능성을 높일 수 있다.
함수형 프로그래밍의 주요 개념
순수함수
순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않는 함수다. 외부 상태란 전역 변수 등을 말한다. 순수 함수를 사용하면 코드의 예측 가능성이 높아지고, 디버깅과 유지보수가 쉬워진다. 외부 상태에 의존하지 않기 때문에 함수가 호출되는 맥락에 관계없이 동일하게 동작하여 재사용성이 높아진다. 또한, 순수 함수는 입력과 출력만 고려하면 되므로 테스트가 간단하고, 외부 상태를 참조함에 따른 side effect가 없어서 테스트 커버리지를 높일 수 있다.
고차함수
고차 함수는 다른 함수를 매개변수로 받거나 함수를 결과로 반환하는 함수이다. 고차 함수는 수학에서 쓰이는 개념이며 자바스크립트에서 고차함수에는 map, reduce, filter같은 함수가 있다. 자바스크립트에서 함수는 일급 객체로 변수에 할당되고 인수에 전달될 수 있고 다른 함수들의 return값으로 쓰일 수 있다. 고차함수는 외부 상태의 변경이나 가변 데이터를 피하고, 불변성을 지향하는 함수형 프로그래밍에 기반을 두고 있다.
일급 함수
함수형 프로그래밍에서 일급 함수는 데이터 타입 변수로 취급되며, 다른 변수들처럼 사용할 수 있다. 이러한 일급 변수는 함수의 매개변수로 전달되거나 데이터 구조에 저장될 수 있다. 자바스크립트에서 함수는 일급 객체이다.
불변성
불변성은 데이터가 한 번 생성된 후에는 절대 변경되지 않는다는 원칙이다. 기존 객체를 수정하는 대신, 원하는 변경 사항이 적용된 새로운 객체를 생성하는 방식이다. 이는 side effect를 방지하고 데이터의 무결성을 유지할 수 있지만 메모리를 많이 차지하게 된다. 자바스크립트의 객체와 배열은 가변적이기 때문에 불변성을 유지하는 데는 다양한 방법이 있다. 예를 들어 const를 사용해 식별자가 새로운 값으로 재할당되지 않도록 하거나, Object.freeze()를 사용해 객체의 변경을 막을 수 있다. 또한 json.stringfy등을 이용해 기존 객체나 배열을 수정하지 않고 새로운 객체나 배열을 생성하는 방식으로 불변성을 유지할 수 있다. 물론 객체 안의 객체를 깊은복사 할때는 객체 내부를 순환하며 깊은 복사를 하는 것이 중요하다.
참고자료
- Wikipedia. (n.d.). Functional programming. Retrieved July 15, 2024, from https://en.wikipedia.org/wiki/Functional_programming
- Turing.com. (n.d.). Introduction to functional programming. Retrieved July 15, 2024, from https://www.turing.com/kb/introduction-to-functional-programming#first-class-functions
- Merced, A. (n.d.). Deep dive into functional programming in JavaScript. Dev.to. Retrieved July 15, 2024, from https://dev.to/alexmercedcoder/deep-dive-into-functional-programming-in-javascript-851
'JS' 카테고리의 다른 글
[JS] Promise와 Async/Await의 이해 (0) | 2024.08.23 |
---|---|
[JS] Javascript에서 동기함수와 비동기함수의 차이 (0) | 2024.07.25 |
[JS] Javascript에서의 모듈 시스템 (1) | 2024.07.23 |
[JS] Javascript에서의 OOP (0) | 2024.07.22 |
[JS] Javascript에서의 Memory Management (0) | 2024.07.18 |