본문 바로가기

개발/JAVA

[Java] for문 vs Stream 성능 비교 및 차이점 정리

반응형

Java 8 이상에서는 컬렉션을 처리할 때 for문 대신 Stream API를 활용하는 경우가 많습니다.
코드를 더 간결하게 만들 수 있고, 병렬 처리도 쉽게 가능하죠.
하지만 성능이나 가독성 측면에서는 어떤 차이가 있을까요?

오늘은 실제 성능 비교 테스트와 함께 for문과 Stream의 차이를 정리해보겠습니다.


✅ 1. 기본 차이점

항목for문Stream
프로그래밍 스타일 명령형 (Imperative) 선언형 (Declarative)
코드 길이 비교적 길고 절차적임 짧고 함수형 스타일
병렬 처리 직접 쓰레드 구현 필요 .parallel() 사용으로 간단함
학습 난이도 직관적이고 쉬움 함수형 개념 이해 필요

✅ 2. 예시: 문자열 숫자들의 합 구하기

String numStr = "1234567890";

🔸 for문 방식

int sum = 0; 
for (int i = 0; i < numStr.length(); i++) { 
	sum += numStr.charAt(i) - '0'; 
}
 

🔸 Stream 방식

 
int sum = numStr.chars()
                .map(c -> c - '0')
                .sum();

두 코드 모두 결과는 45를 출력합니다.


✅ 3. 성능 비교 테스트

10억 개의 숫자를 더하는 시나리오를 통해 성능을 비교해봅니다.

public class ForVsStreamPerformanceTest {
    public static void main(String[] args) {
        int[] numbers = new int[100_000_000];
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = i % 10;
        }

        // For문
        long start = System.currentTimeMillis();
        long forSum = 0;
        for (int i = 0; i < numbers.length; i++) {
            forSum += numbers[i];
        }
        long forTime = System.currentTimeMillis() - start;
        System.out.println("For문 합계: " + forSum + " / 시간: " + forTime + "ms");

        // Stream
        start = System.currentTimeMillis();
        long streamSum = java.util.Arrays.stream(numbers).asLongStream().sum();
        long streamTime = System.currentTimeMillis() - start;
        System.out.println("Stream 합계: " + streamSum + " / 시간: " + streamTime + "ms");

        // 병렬 Stream
        start = System.currentTimeMillis();
        long parallelSum = java.util.Arrays.stream(numbers).parallel().asLongStream().sum();
        long parallelTime = System.currentTimeMillis() - start;
        System.out.println("Parallel Stream 합계: " + parallelSum + " / 시간: " + parallelTime + "ms");
    }
}

✅ 결과 (대략적인 예시)

방식실행 시간 (ms)
for문 180ms
Stream 250ms
병렬 Stream 90ms

환경에 따라 다르지만, 일반적으로 for문은 빠르고, parallelStream은 큰 데이터에서 매우 강력합니다.


✅ 결론

상황추천 방식
간단한 반복 처리 for문
가독성 & 함수형 스타일 추구 Stream
대용량 데이터 + 멀티코어 환경 parallelStream

Stream은 코드가 짧고 선언적이라 현대적인 Java 스타일로 각광받고 있지만, 단순한 반복에는 여전히 for문이 유리할 때도 많습니다. 상황에 맞는 선택이 가장 중요합니다.

반응형