자바스크립트는 함수형 프로그래밍에 적합한 언어일까?
함수형 프로그래밍은 객체지향형, 절차형과 같이 일종의 프로그래밍 패러다임입니다. 따라서 객체지향에 적합한 언어(C++, JAVA)가 있는 것처럼, 함수형 프로그래밍에도 적합한 언어로 해야만 그 진가가 발휘됩니다. 자바스크립트는 어떨까요? 자바스크립트는 객체지향과 함수형을 혼합한 하이브리드 언어라고 볼 수 있습니다. 지배적인 패러다임이 없기때문에 적절하게 골라서 섞어서 패러다임을 사용할 수 있습니다. 지금부터는 함수형 언어로서의 자바스크립트에 대해서 알아보겠습니다.
자바스크립트가 함수형 언어인 이유
자바스크립트 언어는 리스프(Lisp), 스킴(Scheme)과 같은 함수형 언어의 영향을 받아 함수형 언어로서의 기능들을 갖추고 있습니다. 예를 들어 고계 함수, 클로저, 배열 리터럴 등은 함수형 기법을 활용하기 위해 필요합니다. 또한 화살표 함수, 상수, 이터레이터, 프로미스 등 함수형 프로그래밍에 걸맞는 기능들이 ES6에 추가되었고 앞으로도 추가될 예정입니다.
자바스크립트에서 함수는 일급 시민입니다. 그리고 이 점은 함수형 프로그래밍에서 굉장히 중요한 부분입니다. 일급 시민이라는 것은 함수를 변수에 바인딩하거나, 매개변수 혹은 리턴값으로 함수를 사용할 수 있음을 의미합니다. 이처럼 함수르 인수로 전달 받거나 반환하는 함수를 고계함수라고 합니다. 예를 들어 배열의 sort() 메서드는 sort 방식을 결정하는 함수를 인자로 받기 때문에 고계함수 입니다. 고계함수를 이용하면 장황하게 작성되었을 프로그램을 단순하게 주링ㄹ 수 있습니다. 예를 들어 수학 점수가 60점 이상인 학생을 출력하는 프로그램을 만든다고 한다면 명령형으로는 다음처럼 작성이 가능합니다.
function printStudentsWithMathScoreOver60(students) {
for (let i = 0; i < students.length; i++) {
if (students[i].scores.math > 60) {
console.log(students[i]);
}
}
}
이 코드는 우리가 하고자하는 작업을 완벽하게 해냅니다. 그러나 이번에 영어 점수가 60점 이상인 학생을 출력하고자 한다면 어떨까요? 3번째줄만 제외하고 동일한 코드를 중복으로 작성해야 할 것입니다. 그러나 함수형 프로그래밍과 고계 함수를 사용하면 원하는 로직을 함수로 분리해서 코드의 재사용성이 훨씬 늘어납니다. 이번엔 함수형으로 작성해보게습니다.
function logStudent(student) {
console.log(student);
}
function isMathScoreOver60(student) {
return student.scores.math > 60
}
function isEnglishScoreOver60(student) {
return student.scores.english > 60
}
function printStudent(students, selector, printer) {
students.forEach(student => {
if (selector(student)) {
printer(student)
}
}
}
const printStudentWithMathScoreOver60 = printStudent(students, isMathScoreOver60, logStudent)
const printStudentWithEnglishScoreOver60 = printStudent(students, isEnglishScoreOver60, logStudent)
printStudent는 selector, printer라는 함수를 인자로 받는 고계함수입니다. 이 함수 덕분에 작업할 내용을 선언적으로 작성하여 코드가 간결해지고 재사용성이 높아진 것을 확인할 수 있습니다. 만약 해당 조건을 만족하는 학생들을 콘솔에 출력이 아니라 파일에 출력하고 싶으면 printer 함수로 다른 함수를 넘겨 주면 될겁니다.
자바스크립트가 함수형 언어로서 미흡한 점
지난 글에서도 작성했듯이 함수형에서 데이터의 불변은 매우 중요합니다. 그러나 자바스크립트에서는 객체의 상태를 보호하기란 까다롭습니다. 자바스크립트의 객체는 동적이기 때문에 언제나 속성을 추가, 변경, 삭제 할 수 있습니다. 또한 private 속성이 따로 없기 때문에 캡슐화하기도 어렵습니다. Object.freeze를 사용한다면 객체를 동결할 수 있지만 얉게 동결이 되기에 깊이 동결하기 위해선 함수를 만들어서 사용해야 합니다. 혹은 immutable.js와 같은 라이브러리의 도움을 받아 데이터의 불변성을 지킬 수 있습니다.
마무리
이번 글에서는 함수형으로서의 자바스크립트에 대해 알아봤습니다. 다음 글에서는 몇가지 고계함수들에 대해서 알아보겠습니다.
정리
- 자바스크립트는 객체지향과 함수형이 혼합된 언어이다.
- 고계함수, 일급 함수는 함수형 자바스크립트를 구사하는 근간이다.
- 불변성을 제공하지 않는 점이 아쉽지만, 라이브러리나 Object.freeze를 사용하면 어느정도 보완 가능하다.
'함수형 프로그래밍' 카테고리의 다른 글
| 함수형 자바스크립트 (6-1) - 함수자, 모나드를 이용한 예외처리 (0) | 2022.10.09 |
|---|---|
| 함수형 자바스크립트 (5) - 함수 조합기 (0) | 2022.09.08 |
| 함수형 자바스크립트 (4) - 부분 적용, 커링 (0) | 2022.08.28 |
| 함수형 자바스크립트 (1) - 함수형으로 사고하기 (0) | 2022.08.23 |