HOWTO · Java

Java에서 배열의 합계 얻기

루프와 스트림을 사용하여 Java에서 배열의 합계를 구하는 방법을 알아보세요.

이 페이지의 내용

Java에서 int[]의 합을 구하려면 간결한 기본 방법인 Arrays.stream(numbers).sum()을 사용하거나, 직접 제어하고 싶을 때 for 루프로 각 값을 더하면 됩니다. Java 배열에는 인스턴스 sum() 메서드가 없습니다. Arrays.stream(int[])은 배열 값을 IntStream으로 바꾸며, 이 스트림에서 sum()과 reduce()를 사용할 수 있습니다.
배열 합산은 Java 튜토리얼의 핵심 데이터 연산 중 하나로, 배열 및 컬렉션 가이드를 기초부터 스트림까지 순서대로 정리합니다.

아래 예제는 여섯 개의 값을 공통으로 사용하며, 이 값들의 합은 149입니다. 각 프로그램은 독립적으로 실행할 수 있으며 SimpleTesting.java라는 이름으로 저장하면 됩니다.

for 루프로 int 배열의 합 구하기

일반적인 루프에서는 각 단계가 명확히 드러납니다. 누산기를 초기화하고, 모든 인덱스를 차례로 살펴보며, 해당 요소를 더합니다. 계산 과정을 따라가거나 순회 중에 다른 로직을 추가하려는 경우에 이해하기 쉬운 방법입니다.

이 프로그램은 numbers에 있는 여섯 값을 더해 합계를 출력합니다. 루프 조건에는 numbers.length를 사용하며, 배열 이름도 길이와 요소에 접근할 때 일관되게 사용합니다.

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = 0;

    for (int i = 0; i < numbers.length; i++) {
      total += numbers[i];
    }

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

병렬 스트림과 reduce로 int 배열의 합 구하기

Arrays.stream(numbers)가 반환하는 IntStream에 parallel()을 호출하면 병렬 스트림을 사용할 수 있습니다. 두 인수를 받는 reduce는 항등값(0)과 덧셈 연산을 사용합니다. 덧셈은 결합 법칙이 성립하므로 부분 합을 결합해도 같은 결과를 얻을 수 있습니다. 배열이 짧다면 병렬 처리가 주변 작업에 적합한 경우가 아니라면 순차 버전을 우선 고려하세요. 병렬 실행이 작은 계산을 자동으로 더 빠르게 만들어 주지는 않습니다.

import java.util.Arrays;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = Arrays.stream(numbers)
        .parallel()
        .reduce(0, (left, right) -> left + right);

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

Arrays.stream(...).reduce(...)로 int 배열의 합 구하기

순차 스트림을 사용하려면 parallel()을 생략합니다. Arrays.stream(int[])은 이 경우에도 IntStream을 반환합니다. reduce(0, Integer::sum)은 항등값으로 시작해 각 기본형 값을 덧셈으로 결합합니다. 결합할 값이 하나도 없을 때도 항등값 덕분에 연산 결과가 명확하게 정의됩니다.

import java.util.Arrays;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = Arrays.stream(numbers).reduce(0, Integer::sum);

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

Arrays.stream(...).sum()으로 int 배열의 합 구하기

덧셈을 하려는 경우 sum()은 reduction보다 의도를 더 직접적으로 표현합니다. 이 메서드는 배열에서 만든 IntStream의 최종 연산이며, 합계를 int로 반환합니다.

이 메서드의 반환형은 int이므로 합계에는 Java의 32비트 정수 연산이 적용됩니다. 실제 합이 int 범위를 넘을 수 있다면 더하기 전에 스트림의 값을 넓히세요. 예를 들면 Arrays.stream(numbers).asLongStream().sum()을 사용할 수 있습니다. 일반 루프에서 이 범위를 처리할 때도 long 누산기와 넓힌 값이 필요합니다.

import java.util.Arrays;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = Arrays.stream(numbers).sum();

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

IntStream.of(...).sum()으로 int 배열의 합 구하기

IntStream.of(numbers)도 int[]에서 IntStream을 직접 만드는 방법입니다. 이 스트림의 sum() 연산은 Arrays.stream(numbers).sum()과 같은 합계를 반환합니다. 코드에서 어느 쪽이 더 자연스럽게 읽히는지에 따라 선택하면 됩니다.

import java.util.stream.IntStream;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = IntStream.of(numbers).sum();

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

간결한 for 루프로 int 배열의 합 구하기

아래 루프는 초기화, 반복 조건, 누적을 for 헤더에 넣은 뒤 배열의 마지막 인덱스부터 첫 인덱스까지 순회합니다. 유효한 Java 코드이지만, 본문이 비어 있고 갱신식에서 감소 연산을 수행하므로 일반적인 루프보다 한눈에 파악하기 어렵습니다. 특별히 간결한 형태가 필요한 경우가 아니라면 더 명확한 일반 루프를 사용하세요.

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total;
    int i;

    for (total = 0, i = numbers.length - 1;
         i >= 0;
         total += numbers[i--]) {
      // Accumulation happens in the loop update expression.
    }

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149