Java/자바 정리

178. 스트림 집계 연산 – sum() vs reduce()

코딩하는냥이 2025. 5. 26. 13:01
반응형

자바의 스트림 API에서는 합계, 평균, 최대값 등 다양한 집계 연산을 제공하며,
sum()처럼 간편한 메서드도 있지만 보다 유연하게 처리할 수 있는 reduce()도 존재합니다.
이번 예제에서는 두 방식으로 학생 점수의 합계를 구하는 방법을 비교해보겠습니다.


📦 Student.java

package ch17.sec11;

public class Student {
	private String name;
	private int score;

	public Student(String name, int score){
		this.name = name;
		this.score = score;
	}

	public String getName() {
		return name;
	}

	public int getScore() {
		return score;
	}
}

📌 예제 코드

package ch17.sec11;

import java.util.Arrays;
import java.util.List;

public class ReductionExample {
	public static void main(String[] args) {
		List<Student> list = Arrays.asList(
			new Student("홍길동", 92),
			new Student("파이썬", 95),
			new Student("김자바", 88)
		);

		// 방법 1: mapToInt + sum()
		int sum = list.stream()
			.mapToInt(Student::getScore)
			.sum();
		System.out.println("sum1 : " + sum);

		// 방법 2: map + reduce()
		sum = list.stream()
			.map(Student::getScore)
			.reduce(0, (a, b) -> a + b);
		System.out.println("sum2 : " + sum);
	}
}

💻 실행 결과

sum1 : 275
sum2 : 275

💬 코드 설명

  • mapToInt(Student::getScore).sum()
    → IntStream으로 변환 후 내장된 합계 메서드를 사용합니다. 가장 간결하고 빠릅니다.
  • map(Student::getScore).reduce(0, (a, b) -> a + b)
    → 점수만 추출 후 reduce()를 통해 초깃값 0에서 시작하여 누적합니다.
    (a, b) -> a + b는 합계를 누적하는 람다식입니다.

💡 포인트 정리

  • sum()은 기본형 스트림(IntStream 등) 에서만 제공되며, 가장 빠르고 간편합니다.
  • reduce(identity, accumulator)는 모든 스트림 타입에서 사용 가능하며,
    다양한 누적 연산(곱셈, 문자열 합치기 등)에도 응용할 수 있습니다.
  • reduce()는 직접 연산식을 지정하기 때문에 유연한 집계 처리가 가능합니다.

📌정리하자면, 이번 예제에서는 학생 객체 리스트를 스트림으로 변환한 뒤
sum()과 reduce() 두 가지 방식으로 점수의 총합을 구해보았습니다.
간단한 합계에는 sum()이 편리하고, 더 복잡한 누적 연산에는 reduce()가 유리하다는 점을 기억해두시면 좋습니다.