for-Loop와 stream api

HwangJerry·2023년 5월 24일
0

java8부터는 stream을 이용하여 함수형 프로그래밍을 적극적으로 지원한다. 따라서 우리는 list collection 내의 요소를 출력하는 방식을 다음 세 가지로 요약해볼 수 있다.

//기존의 for-loop
for (int i = 0; i < list.size(); i++) {
  System.out.println(list.get(i));
}

//향상된 for-Each
for (String item : list) {
  System.out.println(item);
}

//stream.forEach()
list.stream().forEach(System.out::println);

위와 같이 작업을 수행할 수 있다. 이 외에도 우리는 각 요소에 대하여 처리할 때object.stream().map(o -> function(o)).collect(Collectors.toList());등과 같은 방식도 자주 마주하게 된다.

이처럼 자바를 사용할 때 stream을 이용한 함수형 프로그래밍 기법을 종종 마주하게 되는데, 처음 배우는 입장에서는 for-loop의 for each 방식을 사용하는게 직관적이라 느껴서 왜 stream이 나왔고 왜 사용하는지가 궁금했다.

성능 차이


성능이 더 좋아서 stream()을 사용하게 된 것인가 가정해보고 알아보았다.

다음과 같은 코드로 누군가(출처)가 성능을 친절하게 비교해 두었다.

List<Integer> l = createIntList(100000);

long startTime = System.nanoTime();
for(int i = 0; i < l.size(); i++) {
	l.set(i, l.get(i) + 1);
}
long endTime = System.nanoTime();

System.out.println(String.format("for-loop: %dns", endTime - startTime));

startTime = System.nanoTime();
l = l.stream().map(n -> n--).collect(Collectors.toList());
endTime = System.nanoTime();

System.out.println(String.format("Stream: %dns", endTime - startTime));

위 코드를 통해 성능을 비교해보면 다음과 같다고 한다.

// 10 size로 테스트
for-loop: 13455ns
Stream: 55508377ns

// 100 size로 테스트
for-loop: 72114ns
Stream: 57743007ns

// 100000 size로 테스트
for-loop: 10447214ns
Stream: 72403508ns

위 결과를 통해 알 수 있는 점은 for-loop가 stream보다 최소 배 이상 빠르다는 것이다.

for-loop은 단순 인덱스 기반이고, stream의 경우 JVM이 이것저것 처리해줘야 해서 속도 차이가 발생한다고 한다.

또한 for-loop은 오랫동안 사용해온 형식이기에 컴파일러가 최적화를 시키기에 원활하다고 한다. 하지만 stream은 for-loop에 비해서는 그 만큼의 최적화를 이루기에는 아직 부족하다고 한다(?).

왜 Stream을 사용하는가?

위에서 다룬 내용에 의하면 왜 stream을 사용해야 하는가에 대한 의문이 드는 건 당연한 일일 것이다. 왜 사용하는지를 간단히 정리해봤다. 이는 결국, 함수형 프로그래밍의 장점과 이어진다.

스트림을 사용하면 기능을 구현하지 않고 선언형으로 컬렉션 데이터를 처리할 수 있다. 다시 말해, 스트림을 사용하면 여러 줄로 작성하던 반복문과 조건문을 한 줄로 멋지게 만들 수 있다.

즉, 가독성이 좋아지고 코드가 간결해진다. 물론 모든 경우에서 이렇다고 말할 순 없고, 경우에 따라 for-loop이 더 가독성 좋을 때도 있다.

이를 더 체감하기 위해서는 함수형 프로그래밍에 대하여 더 깊게 이해해봐야 할 것 같다. 아직까지는 for-loop이 더 편한 상태이지만, 분명 사람들이 사용하는 데에는 이유가 있을 것이니, 익숙해지도록 노력해봐야겠다.

출처 : 성능 비교
출처 : 스트림 API 학습 자료
출처 : stream api를 사용하는 이유

profile
알고리즘 풀이 아카이브

0개의 댓글