Java/자바 정리

174. 스트림에서 중간 연산 출력 – peek()과 forEach()의 차이

코딩하는냥이 2025. 5. 26. 11:55
반응형

스트림 API를 사용할 때 데이터 흐름을 중간에 확인하거나
최종 결과를 출력하고 싶을 때 사용할 수 있는 메서드들이 있습니다.
이번 예제에서는 peek()과 forEach()의 차이를 실습해보며,
중간 연산과 최종 연산의 개념을 함께 정리해보겠습니다.


📌 예제 코드

import java.util.Arrays;

public class LoopingExample {
	public static void main(String[] args) {
		int intArr[] = { 1, 2, 3, 4, 5 };

		// peek() 단독 사용 → 출력되지 않음 (최종 연산이 없음)
		Arrays.stream(intArr)
			.filter(a -> a % 2 == 0)
			.peek(System.out::println);  // 실행 안 됨

		// peek() + sum() → 중간 연산이 실제로 실행됨
		int total = Arrays.stream(intArr)
			.filter(a -> a % 2 == 0)
			.peek(System.out::println)  // 중간 출력 (짝수만)
			.sum();
		System.out.println("총합 : " + total + "\n");

		// forEach()는 최종 연산으로 직접 실행됨
		Arrays.stream(intArr)
			.filter(a -> a % 2 == 0)
			.forEach(System.out::println);
	}
}

💻 실행 결과

2
4
총합 : 6

2
4

💬 코드 설명

  • peek()는 중간 연산으로, 다음 최종 연산이 실행되기 전까지는 동작하지 않습니다.
    • 첫 번째 peek()는 최종 연산이 없어 실제 출력되지 않습니다.
  • 두 번째 peek()는 sum()이라는 최종 연산과 함께 사용되어
    실제로 짝수 요소가 출력됩니다.
  • forEach()는 최종 연산으로, 직접 요소를 소비하며 바로 실행됩니다.

💡 포인트 정리

  • peek()는 중간 상태를 확인하는 용도이며, 디버깅이나 로그 출력에 적합합니다.
  • peek() 단독으로는 실행되지 않고, 최종 연산(sum, collect, forEach 등)이 있어야 작동합니다.
  • forEach()는 스트림을 종료시키는 최종 연산입니다.
  • 중간 연산은 지연(lazy) 실행, 최종 연산은 즉시 실행(eager)됩니다.

📌정리하자면, 이번 예제에서는 peek()를 사용해 중간 연산 흐름을 살펴보고,
forEach()를 통해 최종 결과를 출력하는 구조를 비교해보았습니다.
스트림의 중간 처리 과정이 궁금할 때는 peek()를 활용하고,
출력 자체가 목적이라면 forEach()를 사용하는 것이 적절합니다.