이전에 공부했던 내용이지만 잘 설명해준 유튜브를 보고 내용을 정리해 봅니다.
기본 정보
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문을 사용합니다.
'Study' 카테고리의 다른 글
토스 SLASH 22 를 보고.. (0) | 2022.07.11 |
---|---|
INSERT INTO SELECT SHARED LOCK은 레코드 락으로 작동하는가? with MySql (0) | 2022.07.06 |
Entity의 field type은 무엇이 적합할까? (0) | 2022.05.25 |
분산 트랜잭션 설계하기 (초급) (0) | 2022.05.09 |
'AWS와 토스페이먼츠를 통해 E-Commerce 스타트업 혁신하기' 웨비나 후기 (0) | 2022.04.29 |