JavaScript에서는 Array.prototype 객체에 직접 함수를 추가하여 배열의 기능을 확장할 수 있습니다. 이번 글에서는 시작 인덱스와 끝 인덱스를 인자로 받아, 해당 범위에 속한 모든 요소(시작과 끝 인덱스 포함)의 합을 계산하는 배열 함수를 만들어 보겠습니다.
구현 예제
const arr = [1, 2, 3, 4, 5, 6, 7];
const sumRange = function(start = 0, end = this.length - 1){
// 시작 인덱스가 끝 인덱스보다 크면 유효한 범위가 없으므로 0 반환
if(start > end){
return 0;
};
let sum = 0;
for(let i = start; i <= end; i++){
sum += this[i];
};
return sum;
};
Array.prototype.sumRange = sumRange;
console.log(arr.sumRange(0, 4));
출력 결과
콘솔에는 다음과 같이 출력됩니다 −
15
인덱스 0부터 4까지의 요소는 1, 2, 3, 4, 5이며, 이들의 합은 15입니다. 이처럼 this를 활용하면 함수가 호출된 배열 자체에 접근할 수 있어, 어떤 배열에도 재사용 가능한 범위 합계 기능을 손쉽게 추가할 수 있습니다.
reduce()를 활용한 더 간결한 구현
for 반복문 대신 내장 메서드인 reduce()를 사용하면 코드를 훨씬 간결하고 가독성 있게 작성할 수 있습니다.
Array.prototype.sumRange = function(start = 0, end = this.length - 1){
if(start > end) return 0;
return this.slice(start, end + 1).reduce((acc, val) => acc + val, 0);
};
console.log(arr.sumRange(0, 4)); // 15slice()로 원하는 범위의 요소들을 추출한 뒤 reduce()로 누적합을 계산하는 방식으로, 코드의 의도가 명확하게 드러나고 유지보수도 쉬워집니다.