Java

[Java] For문 보다 Stream?

openDeveloper 2023. 4. 1. 23:01

스트림은 컬렉션을 다루는 함수형 프로그래밍 패러다임을 제공합니다. 이를 통해 코드를 간결하고 가독성 좋게 작성할 수 있습니다.

for문은 일반적으로 명령형 프로그래밍 패러다임에서 사용됩니다. for문을 사용하면 코드가 좀 더 복잡해지고, 가독성이 떨어질 수 있습니다. 반면에 스트림을 사용하면 데이터를 처리하는 코드와 로직을 분리시킬 수 있기 때문에 가독성이 높아집니다.

또한, 스트림은 병렬 처리를 쉽게 할 수 있습니다. 이는 대규모 데이터 처리에 유용합니다. 스트림은 내부적으로 데이터를 분할하여 처리하기 때문에 멀티코어 환경에서 병렬 처리가 쉽게 가능합니다. 반면에 for문은 멀티코어 환경에서 병렬 처리가 어렵습니다.

또한, 스트림을 사용하면 중간 연산과 최종 연산을 체이닝하여 작성할 수 있기 때문에 코드의 가독성이 높아집니다. 이를 통해 데이터 처리를 보다 직관적으로 이해할 수 있습니다.

따라서, 스트림은 가독성이 좋고 병렬 처리에 유리하며, 데이터 처리를 함수형 프로그래밍 패러다임으로 구현할 수 있기 때문에 for문보다 스트림을 사용하는 것이 유리합니다.

 

대규모 데이터에서는 스트림이 더 빠를 수도 있다.

 

스트림과 for문은 각각 다른 방식으로 데이터를 처리하기 때문에, 속도 차이가 있을 수 있습니다. 일반적으로 작은 규모의 데이터를 처리할 때는 for문이 스트림보다 빠를 수 있습니다.

그러나 대부분의 경우에는 스트림이 for문보다 빠르거나 비슷한 속도로 데이터를 처리할 수 있습니다. 또한, 대규모 데이터를 처리할 때는 스트림이 병렬 처리를 쉽게 지원하기 때문에 더 빠르게 데이터를 처리할 수 있습니다.

따라서, 속도는 상황에 따라 다를 수 있지만, 스트림을 사용하면 가독성과 유지보수성이 좋아지며, 대규모 데이터 처리에 유리하므로 일반적으로 스트림을 사용하는 것이 좋습니다.

 

primitive types vs wrapper classes

 

기본 자료형(primitive types)의 값은 주로 스택 메모리에 저장됩니다. 스택 메모리는 메서드 호출과 함께 할당되고 해제되는 메모리 영역으로, 메서드의 지역 변수와 매개 변수에 대한 메모리 할당을 관리합니다. 따라서 기본 자료형의 변수가 메서드 내에 선언되면, 해당 변수의 값은 스택에 저장됩니다.

반면에, 래퍼 클래스(wrapper classes)와 다른 객체들은 힙 메모리에 저장됩니다. 힙 메모리는 객체와 인스턴스 변수에 대한 메모리 할당을 관리하는 영역으로, 가비지 컬렉션에 의해 해제됩니다. 래퍼 클래스의 인스턴스는 힙에 할당되고, 해당 인스턴스의 참조가 스택에 저장됩니다.

 

primitive types : 직접 참조로 인해 for문이 stream보다 훨씬 빠르다

wrapper classes : 힙 영역에 할당되어 스택에서 주소를 가져와 간접 참조를 하는 구조로 간접 참조하는 시간적인 비용이 stream vs for문을 비교하는 것보다 절대적으로 시간이 크기 때문에 결과적으로 비슷한 시간 내에 값을 처리한다.

primitive type (기본형) vs wrapper class (래퍼 클래스)

boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double

 

 

 

결론 : 

 Stream은 for문보다 최적화가 되어 있지 않고, 처리하는 데이터의 양이나 선언적 특성(primitive type, wrapper class)에 따라 for문과 비슷하거나 그 이하의 처리 성능을 보여 준다. 실무에서는 데이터는 대부분 wrapper class로 선언되어 있을 테고, 대규모 데이터를 병렬적으로 돌릴수만 있다면 for보다 성능이 잘 나올 수 있을 거 같다. (동기화 처리는 어떻게 해주지..?) 실무에서는 어떻게 사용하지는 궁금하다.

 

 

출처 : https://sigridjin.medium.com/java-stream-api%EB%8A%94-%EC%99%9C-for-loop%EB%B3%B4%EB%8B%A4-%EB%8A%90%EB%A6%B4%EA%B9%8C-50dec4b9974b

'Java' 카테고리의 다른 글

[java] 프로그래머스 : N으로 표현  (0) 2023.04.04
[java] Stream() 정리하기  (0) 2023.04.02
[자료 구조] 그래프 : DFS, BFS  (0) 2023.03.30
JUnit : IntelliJ , 단위 테스트  (0) 2023.03.29
[Java] Collection Set 정리하기  (0) 2023.03.29