Search
🤔

왜 고차함수에서는 조건문과 반복문을 제거할까?

Created
2023/09/17
Tags
JavaScript
Category
Knowledge
Parent item
Sub-item
2 more properties

 의문이 든 이유

고차함수 부분을 다시 공부하다가, 아래 네 가지 단어들과 관계성에 대한 의문이 들었다.
'고차함수'
'함수형 프로그래밍'
'순수함수'
'불변성'
→ 왜 배열의 고차함수에서 조건문 반복문을 쓰면 좋지 않은 것일까?
사실 아직까지는 알고리즘 문제를 풀든 코딩을 하든 무의식적으로 배열의 메서드들보다 손에 더 익은 조건문 반복문을 쓰고 있는데, 그게 좋지 않다고 하니 의문이 들었던 것 같다. 더불어, 아직 코드 상에서 위의 의문에 대한 해답을 제대로 느껴보지 않아서이기도 했다.

 일반적으로 알려진 개념

함수는 최대한 간결하고 직관적으로 나타내야 한다고 알고 있다. 조건문 반복문을 남발하면 가독성이 좋지 않고, 다른 층의 스코프 블록을 만드는 것이므로 코드 작성 시 실수할 확률도 높아지므로 사이드 이펙트가 나타나기 쉽기 때문이다. 이유를 더 구체적으로 나열해 보자면 아래와 같다.

가독성과 유지보수성

고차함수는 주로 배열과 같은 데이터를 처리하고 조작하는 데 사용된다. 이런 함수에서 조건문 반복문을 남발하면 코드가 복잡해지고 가독성이 떨어진다. 한두 개 정도면 괜찮지만, 코드가 방대해질수록 이해하기 어려운 조건식이 많아지고, 결국 코드의 의도를 파악하기 어려워지기 마련이다.

함수는 한 가지 일만

보통 고차함수는 기능을 분리하고 '모듈화'하는 데 사용된다. 이때, 보통 조건문 반복문을 많이 사용하면 여러 조건에 따라 동작을 변경하는 코드가 함수 안에 섞여 있을 가능성이 높다. 이렇게 되면 혼란을 가중시킬 뿐만 아니라, 함수가 한 가지 일만 하는 원칙을 어기고 코드의 재사용성을 떨어뜨릴 수 있다.

함수형 프로그래밍

많은 고차함수는 함수형 프로그래밍 원칙을 따른다. 이러한 원칙 중 하나는 순수 함수(외부 상태를 변경하지 않고 동일한 입력에 대해 항상 동일한 출력을 반환하는 함수)를 사용하는 것이다. 조건문을 사용하면 함수가 더 이상 순수하지 않을 가능성이 있으며, 이는 코드의 예측 불가능성 오류 발생 가능성을 높일 수 있다.

 원론적인 설명

책 <모던 자바스크립트 Deep Dive>에 따르면, 원론적인 설명은 아래와 같다. 더 간결한 설명이다.

 코드를 통해 알아보자

아래의 두 가지 예시 코드를 통해 조건문 반복문을 사용한경우와, 고차함수를 사용한 경우를 한눈에 비교해 보자.

예시 1: 조건문과 반복문을 사용한 코드

배열의 요소 중에서 짝수만 필터링하고, 각 짝수를 제곱한 후 그 합계를 구하는 과정을 나타내는 코드다.
function sumOfEvenSquares(arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { if (arr[i] % 2 === 0) { sum += arr[i] * arr[i]; } } return sum; } const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; const result = sumOfEvenSquares(numbers); console.log(result); // 출력: 220
JavaScript
복사
위 코드는 조건문 (if (arr[i] % 2 === 0))과 반복문 (for 루프)을 사용하여 작성되었다. 이 코드는 동작하지만, 조건문 반복문 사용으로 인해 가독성이 떨어지고, 비슷한 패턴의 코드가 중복되므로 유지보수가 어렵다는 문제점이 있다.

예시 2: 고차함수를 사용한 코드

function sumOfEvenSquares(arr) { return arr .filter((num) => num % 2 === 0) // 짝수만 필터링 .map((num) => num * num)// 제곱 .reduce((acc, num) => acc + num, 0); // 합계 계산 } const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; const result = sumOfEvenSquares(numbers); console.log(result); // 출력: 220
JavaScript
복사
위 코드는 filter, map, reduce와 같은 고차함수를 사용했다. 조건문 반복문을 사용한 코드보다 연산을 위해 목적을 가지고 사용되는 메서드들이 나열되어 순차적으로 코드가 읽히기에 더 간결해 보인다.
더불어 함수형 프로그래밍의 원칙을 따르기 때문에 가독성이 향상되며, 코드 중복이 없어져 유지보수가 쉬워질 것 같다. 뿐만 아니라 조건과 반복을 남발해 불필요한 연산을 방지하고, 딱 필요한 연산만 한다는 장점도 있다.

 결론

따라서 가능하면 배열의 고차함수에서 조건문 반복문 대신 함수형 프로그래밍의 원칙을 따르는 방식으로 데이터를 처리하고 조작하는 것이 좋다. 이렇게 하면 코드가 더 간결하고 이해하기 쉬워지며, 버그를 줄이고 유지보수성을 향상시킬 수 있을 것이다.

참고 자료

책 <모던 자바스크립트 Deep Dive>
고차함수(Higher-Order Function, HOF)는 함수를 인수로 전달받거나 함수를 반환하는 함수를 말한다. 자바스크립트의 함수는 일급 객체이므로 함수를 값처럼 인수로 전달할 수 있으며 반환할 수도 있다. 고차함수는 외부 상태의 변경이나 가변 데이터를 피하고, 불변성을 지향하는 함수형 프로그래밍에 기반을 두고 있다.
함수형 프로그래밍은 순수함수와 보조함수의 조합을 통해 로직 내에 존재하는 조건문과 반복문을 제거하여 복잡성을 해결하고, 변수의 사용을 억제하여 상태 변경을 피하려는 프로그램 패러다임이다.
조건문이나 반복문은 로직의 흐름을 이해하기 어렵게 하여 가독성을 해치고, 변수는 누군가에 의해 언제든지 변경될 수 있어 오류 발생의 근본적인 원인이 될 수 있기 때문이다.
함수형 프로그래밍은 결국 순수 함수를 통해 부수 효과를 최대한 억제하여 오류를 피하고, 프로그램의 안정성을 높이는 노력의 일환이라고 할 수 있다.