[javascript] Math.max(...array)를 함부로 쓰면 안되는 이유

insung·2025년 9월 25일

Math.max를 함부로 쓰면 안되는 이유

const array = Array.from({length: 100000}, () => 0) 
let max = Math.max(...array) 
// run time error 발생
  • 자바스크립트에서 Math.max() 함수는 배열을 인수로 받지 않고, 개별 숫자들을 쉼표로 구분된 인자(argument) 리스트로 받음
  • 그렇기 때문에 배열에서의 최대값을 구하기 위해선 보통 스프레드 문법을 활용해 Math.max(...배열)을 통해 max값을 구하는 것이 일반적
예: array = [1, 5, 3] → Math.max(1, 5, 3) // 5

콜 스택(Call Stack)의 한계

  • 함수가 호출될 때, 전달되는 인자들은 JavaScript 엔진의 메모리 영역인 콜 스택(Call Stack)에 저장
  • 그러나 만약 array 배열의 길이가 매우 클 경우 (수십만 개 이상), 스프레드 문법은 너무 많은 숫자를 인자 리스트로 만들고, 이 인자들이 콜 스택의 허용 용량을 초과하게 됨
  • 결론적으로, 큰 배열을 스프레드하는 것은 RangeError: Maximum call stack size exceeded (최대 호출 스택 크기 초과) 에러를 발생시키기게 되는 것

빈 배열일 때의 문제

  • 만약 빈 배열에 스프레드 문법을 활용해 Math.max를 적용하면 -infinity가 나오는 문제가 있음
Math.max(...[]) // -infinity

해결책

  • reduce()를 활용 또는 단순 for문 순회 활용
  • reduce, for문을 통한 순회는 배열을 순회하며 계산하기 때문에, 콜 스택에 인자를 쌓지 않아 제한 문제에서 자유로움
JavaScript

// 기존 코드 (에러 유발 가능)
// let max = Math.max(...array) 

// 수정된 코드 (안전한 최대값 찾기)
let max;
if (array.length === 0) {
    max = 0; // 배열이 비어있는 경우를 대비
} else {
    max = array.reduce((acc, current) => Math.max(acc, current), array[0]);
}

// for문 활용
let maxv = 0
for(let i=0; i< array.length; i++){
    maxv = Math.max(maxv, array[i])
}
profile
안녕하세요 프론트엔드 관련 포스팅을 주로 하고 있습니다

0개의 댓글