반응형
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문이 유리할 때도 많습니다. 상황에 맞는 선택이 가장 중요합니다.
반응형
'개발 > JAVA' 카테고리의 다른 글
파일 조각 업로드 (Chunked Upload) (0) | 2025.01.07 |
---|---|
[JAVA] 스레드 병렬 처리 방법 (0) | 2024.05.29 |
[Java mail] MIME 구조 (0) | 2024.05.28 |
[JavaMail]메일 프로토콜 POP3와 SMTP, IMAP (1) | 2024.04.29 |
[JavaMail] 메일 헤더 (Mail Headers), 메일 내용 (Mail Content) (0) | 2024.02.19 |