Study

for vs stream

Hyunec 2022. 6. 1. 18:33

이전에 공부했던 내용이지만 잘 설명해준 유튜브를 보고 내용을 정리해 봅니다.

 

기본 정보

for, foreach

  • 구체적인 로직이 외부에 노출되는 외부 반복의 형태입니다.
  • for문은 java 1, foreach문은 java 5부터 등장했습니다.
  • foreach문은 컴파일 시 for문으로 변환됩니다.

stream

  • 구체적인 로직이 외부에 노출되지 않는 내부 반복의 형태입니다.
  • 함수형 프로그래밍 패러다임이 도입된 java 8부터 등장했습니다.

차이

  • 익숙함의 차이에서 오는 가독성의 호불호가 있습니다.
  • 디버깅 난이도의 차이가 있습니다.
    • for 에러 발생 위치가 바로 노출됩니다.
    • stream 지연 연산을 통해 실행되기에 에러 발생 시 위치를 추적해야 합니다.
  • 병렬 처리 구현의 차이가 있습니다.
    • for 구체적인 로직을 나누어 구현하고 합쳐야 합니다.
    • stream parallelStream()으로 쉽게 처리됩니다.

 

 

성능 차이

공부했을 때 가장 고민한 부분으로 primitive/array에서는 차이가 있지만, wrapper/collection에서는 큰 차이가 없습니다.

stream은 for문에 비해 최적화가 잘 이루어지지 않았습니다.

  • stream이 for문보다 늦게 나왔기 때문입니다.
  • 하지만 이전과 다르게 java가 빠르게 업데이트되고 있기에 개선을 기대합니다.
https://www.oracle.com/java/technologies/java-se-support-roadmap.html

- 매년 두 번 non-LTS 릴리즈, 날짜는 3월이랑 9월
- 2년마다 LTS 릴리즈

stream은 for문에 비해 오버헤드가 발생합니다.

  • stream 사용을 위해서는 boxing이 필요하지만, for문은 인덱스에 바로 접근하여 오버헤드가 발생하지 않습니다.
  • 하지만 프로덕션 코드에서는 boxing된 collection이 주로 사용되기에 큰 차이는 아니라고 생각합니다.

 

나의 사용법

저는 프로덕션 코드에서 stream과 boxing-unboxing 최소화를 위해 wrapper type 사용을 선호합니다.

  • 개인적으로는 가독성이 훨씬 좋다고 생각합니다.
  • JDK 발전에 따라 지원되는 API와 최적화 혜택을 받을 수 있습니다.
  • 코딩 스타일의 일관성을 가져갈 수 있습니다.
  • 나아가 메서드/클래스 분리나 함수형 프로그래밍으로의 전환이 용이합니다.
  • primitive 사용이 메모리나 속도면에서 좋다는 주장도 있지만,
    • type을 일관되게 사용함으로 인해 boxing을 줄입니다.
    • 현대 개발은 변경에 강하도록 가독성을 올리고 비용을 더 들이는 것이 낫다고 생각합니다.
    • 조금의 속도 차이는 감수할 수 있습니다.
  • 일부 최적화된 성능이 필요하거나, 공통 모듈에서는 primitive와 for문을 사용합니다.