본문 바로가기

개발 이모저모

for/while 반복문 VS streamAPI 뭐가 더 좋을까?

728x90
반응형

로직을 구현하다보면 반복문을 작성할 때 우리가 흔히 알고있는 for, while과 같은 반복문과 streamAPI 둘 중 어떤걸 사용하는게 좋을까? 이러한 궁금증이 생겨서 찾아보았다.
 

1. 반복문 (for, while)

  • 전통적인 반복문으로 코드가 데이터 처리 흐름을 일일이 제어한다.
  • 로프 변수를 사용하여 데이터에 접근한다.
  • 명령형 프로그래밍방식으로 어떻게 처리할지에 대해 표현한다.
List<String> names = List.of("Alice", "Bob", "Charlie");
List<String> result = new ArrayList<>();

for (String name : names) {
    if (name.startsWith("A")) {
        result.add(name.toUpperCase());
    }
}
System.out.println(result);
// 결과 : [ALICE]
  • 장점
    • 대부분의 개발자에게 친숙하고 이해하기 쉽다.
    • break/continue와 같은 문법을 같이 사용해서 반복구조를 세세하게 제어할 수 있다.
    • 루프내에서 중간값을 쉽게 확인 할 수 있고, 디버깅도 쉽다.
  • 단점
    • 코드가 길어질 수 있어 가독성이 떨어지거나, 의도가 명확하지 않게 구현될 수 있다.
    • 병렬 처리를 위해 추가 코드를 작성해야되서 병렬처리가 어렵다.

 
2. Stream API

  • 데이터의 흐름을 정의하고 처리방식을 추상화 한다.
  • 메서드 체이닝 방식으로 작업을 연결한다.
  • 선언형 프로그래밍 방식으로 무엇을 처리할지를 표현한다.
List<String> names = List.of("Alice", "Bob", "Charlie");
List<String> result = names.stream()
    .filter(name -> name.startsWith("A")) // 'A'로 시작하는 이름 필터링
    .map(String::toUpperCase)             // 이름을 대문자로 변환
    .collect(Collectors.toList());       // 결과를 리스트로 수집
System.out.println(result); 

// 결과 : [ALICE]
  • 장점
    • 코드가 짧고 의도가 명확히 드러나 간결하다.
    • 데이터 처리 단계를 메서드 체이닝으로 표현하여 흐름을 쉽게 이해할 수 있어 가독성이 높다.
    • parallelStream()을 사용하면 병렬처리를 구현할 수 있다.
    • stream연산은 원본 데이터를 변경하지 않고 새로운 결과를 생성하여 불변성을 유지할 수 있다.
  • 단점
    • 간단한 작업에서는 오히려 오버헤드가 발생하여 작업에 비효율성을 높일 수 있다.
    • stream 체이닝 중간값을 디버깅 하기 쉽지 않다.
    • stream은 한 번 소비하면 재사용 할 수 없어 추가 작업이 필요할 수 있다.
    • 초보개발자나 해당 문법을 처음 접하는 사람에게는 익숙하지 않아서 이해하기 어려울 수 있다.

 


두 가지 방법에 대해서 장/단점이 있다. 개발 할 때 해당 상황에 맞춰서 반복문이나 stream api를 사용하면 좋을 것 같다.

전통적인 반복문을 사용하면 좋은 상황은

  1. 복잡한 제어 흐름이 필요한 경우: break, continue, 중첩 루프 등이 필요한 경우 용이하다.
  2. 성능이 중요한 간단한 작업: 반복문은 Stream API에 비해 오버헤드가 적어 좋다.
  3. 익숙하고 빠르게 작성해야 할 때: 단순 반복 작업에는 반복문이 직관적이라 좋다.


Stream API를 사용하면 좋은 상황은

  1. 데이터 변환/필터링이 주요 작업인 경우: 스트림 체이닝으로 쉽게 표현 할 수 있기 때문이다.
  2. 데이터 처리의 단계가 명확히 구분될 때: 필터링, 매핑, 집계 등 작업이 쉽다.
  3. 병렬 처리가 필요할 때: parallelStream()으로 손쉽게 구현 할 수 있다.
  4. 원본 데이터를 불변으로 유지하고자 할 때: 스트림은 원본 데이터를 변경하지 않기 때문에 좋다.

 
 
 
 
Stream API에 대한 설명 참고 : 2025.01.11 - [개발 이모저모] - 자바 Stream API , stream() , 자바 반복문
 
 
 

728x90
반응형