반응형
🔍 Java for문 vs Stream – 언제 어떤 걸 써야 할까?
stream() 사용이 익숙치 않아 for문 사용만 고려하고 있었다.
최근 코드의 가독성과 간편성을 위해서 stream 형태로 바꾸고 있다!
✅ 1. 기본 개념
🌀 for문
기본 반복문. 가장 전통적인 방식이며 유연하고 익숙함.
List<String> names = Arrays.asList("Tom", "Jerry", "Spike");
for (String name : names) { System.out.println(name); }
🌊 Stream
Java 8부터 등장한 함수형 스타일의 데이터 처리 방식.
선언형 코드로 간결하게 표현할 수 있고 병렬 처리도 가능.
names.stream() .forEach(System.out::println);
🔍 2. 차이점 비교
가독성 | 직접 제어 → 장황해질 수 있음 | 간결하고 선언적 |
성능 | 더 빠를 수 있음 (간단 반복일 경우) | 내부적으로 최적화됨 (특히 병렬 Stream) |
가변 변수 사용 | 자유로움 | final or effectively final 필요 |
예외 처리 | try-catch 자유롭게 가능 | 복잡해지면 가독성 ↓ |
병렬 처리 | 직접 스레드 작성 필요 | .parallelStream()으로 간단하게 처리 |
📌 3. 언제 for문을 쓰고 언제 Stream을 쓸까?
✅ for문이 더 나은 경우
- 인덱스 접근이 필요한 경우 (i, i + 1, i - 1)
- 중간에 break, continue, return 등 제어가 중요한 경우
- 복잡한 조건 분기나 다단계 상태 처리
✅ Stream이 더 나은 경우
- 필터링, 매핑, 수집 등 데이터 처리 로직이 많을 때
- 가독성이 중요한 반복 로직 (ex: .filter().map().collect())
- 병렬처리를 간단히 하고 싶을 때
🛠️ 실전 예시 비교
💬 이름 중에 “T”로 시작하는 것만 필터링
// for문
List<String> result = new ArrayList<>();
for (String name : names) { if (name.startsWith("T")) { result.add(name); } }
// Stream
List<String> result = names.stream()
.filter(n -> n.startsWith("T")).collect(Collectors.toList());
💡 인덱스가 필요한 경우는 for문만 가능
// Stream은 인덱스를 직접 다루지 못함
for (int i = 0; i < list.size(); i++) {
System.out.println(i + ": " + list.get(i));
}
⚠️ 주의할 점
- Stream은 lazy evaluation이므로 중간 연산만 쓰고 .collect(), .forEach() 등 종단 연산을 꼭 붙여야 동작
- Stream 내부에서 예외 처리하려면 .map()이나 .forEach() 안에서 try-catch를 써야 해서 복잡해질 수 있음
✅ 결론
단순 반복, 인덱스 사용, break 필요 | for문 |
필터링, 변환, 수집 등 데이터 파이프라인 | Stream |
병렬 처리 | parallelStream() |
✨ 한 줄 요약
간결한 데이터 흐름 처리 = Stream,
제어가 중요한 반복 = for문
반응형
'Backend Web > Java' 카테고리의 다른 글
[JAVA] 조건문 (0) | 2022.01.31 |
---|---|
[JAVA] 자바 기본 지식 (0) | 2022.01.31 |
[JAVA] 람다 (0) | 2021.11.21 |
[JAVA] 변수 (0) | 2021.11.21 |
[Java] 상속(Inheritance) (0) | 2021.11.12 |