오늘은 스트림에 대해서 공부해보았다.
스트림은 자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능이다.
자세한 설명은 아래와 같다.
스트림 연산 중 중간연산에 대한 설명이다.
reduce()연산에 대한 설명이다
<추가공부>
자바 스트림
출처: blog.naver.com/hoyo1744/221582271989
* 윤성우 열혈 java 프로그래밍의 내용을 공부하여 정리한 내용입니다.
*스트림의 이해
내부가 비어 있는 긴 파이프의 한 쪽 끝으로 물을 흘려보내면, 그 물이 다른 한쪽으로 흘러나온다. 이 때 이러한 물의 흐름을 가리켜 '스트림'이라 한다. 이와 유사하게 자바에서도 데이터의 흐름을 생성할 수 있으며, 이러한 데이터의 흐름을 가리켜 '스트림'이라 한다.
우리는 다음과 같은 일을 생각해 볼 수 있다.
"배열 또는 컬렉션 인스턴스에 저장된 데이터를 꺼내서 파이프에 흘려보낸다"
이렇듯 파이프에 흘려보내는 데이터의 흐름을 가리켜'스트림'이라 한다. 그리고 데이터를 흘려 보낼 파이프의 종류(연산의 종류)는 두가지로 나뉜다.
1.중간 연산: 마지막이 아닌 위치에서 진행되어야 하는 연산
2.최종 연산 : 마지막에 진행되어야 하는 연산
스트림을 생성하고 이를 대상으로 중간 연산과 최종 연산을 진행하면, 원하는 기준으로 데이터를 필터링하고 필터링된 데이터의 가공된 결과를 얻을 수 있다.
int[] ar= {1,2,3,4,5}; //배열 ar로 부터 스트림생성 IntStream stm1=Arrays.stream(ar); //중간 연산 진행 IntStream stm2=stm1.filter(n->n%2==1); //최종연산 int sum=stm2.sum(); System.out.println(sum);
위 예제는 배열에 저장된 데이터를 대상으로 스트림을 생서앟고, 이렇게 생성된 스트림을 두개의 파이프를 통과 시켜 얻은 결과를 보여준다.
IntStream stm1=Arrats.stream(ar);
->ar에 저장된 데이터를 대상으로 스트림 생성, 그리고 그 스트림을 sm1이 참조
Arrays클래스에는 stream이라는 이름의 메소드가 다수 정의되어있다. 그리고 이 메소드는 배열을 대상으로 스트림을 생성할 때 호출하는 메소드이다. 즉 위의 문장을 통해서 배열 ar에 저장된 데이터를 대상으로 스트림이 생성된다. 그리고 그 스트림을 참조변수 stm1이 참조하는 상황이다. 참고로 스트림은 데이터의 복사본이라 생각하면 된다. 그것도 중간 연산과 최종 연산을 진행하기 좋은 구조로 배치된 복사본이라 생각하면 된다.
이어서 다음 문장을 보면 다음과 같다.
IntStream stm2=stm1.filter(n->n%2==1);
-->stm1이 참조하는 스트림을 대상으로 filter 연산 진행
위 문장은 stm1이 참조하는 스트림을 filter라는 파이프에 통과시키는 방법을 보여준다.(사실 stm1을 대상으로 filter 연산을 진행한다는것이 정확한 표현이다)
위 문장을 실행하고 나면, filter 연산을 통과하면서 걸러진 스트림을 stm2가 참조하게 된다. 그런데 위의 파이프(연산은) 홀수 데이터만 통과하도록 설계되었다. 즉 짝수는 걸러지고 홀수만 통과하여 이들로 다시 스트림이 형성된다.
끝으로 다음 문장을 보자.
int sum=stm2.sum();
이 문장에서는 홀수로만 이뤄진 stm2가 참조하는 스트림을 대상으로 최종연산인(마지막에 연결하는 파이프인)sum을 진행하고 있다.
최종연산인 sum은 스트림의 데이터를 모두 더하고 그 결과를 반환하는 연산이다. 정리하면, 위의 예제에서는 배열에 저장된 데이터로 스트림을 생성하여 짝수를 걸러내는 파이프와 스트림의 모든 데이터를 더하는 파이프를통과시켜 '홀수의 합'을 계산했다.
*스트림의 특성
int[] ar= {1,2,3,4,5}; //최종연산 int sum=Arrays.stream(ar) .filter(n->n%2==1) .sum(); System.out.println(sum);
위 예제에서 볼 수있듯이, stream과 filter의 반환형은 IntStream이다.
publc static IntStream stream(int[] array)
IntStream filter(IntPredicate predicate)
그리고 예제에서 호출한 filter와 sum은 IntStream의 인스턴스 메소드이다. 따라서 위 예제처럼 스트림생성과 그에 따른 연산과정을 하나의 문장으로 완성할 수 있다.
그리고 스트림의 연산은 효울과 성능을 고려하여 '지연 처리 방식'으로 동작한다. 위 문장에서는 메소드의 호출이 filter에서 sum으로 이어지지만, 정작 sum이 호출될때 까지 filter의 호출결과는 스트림에 반영되지 않는다.즉 최종연산인 sum이 호출되어야 filter의 호출 결과가 스트림에 반영되고, 이어서 sum의 호출 결과가 스트림에 반영된다.
따라서 '최종 연산'은 파이프에 물을 흘려보내기 위한 '잠금 밸브를 여는 행위'를 수반한다고 볼 수 있다.
"만약 중간연산을 진행하고, 최종 연산을 진행하지 않는다면?"
최종 연산이 생략되면 그전에 아무리 많은 중간 연산을 진행했다 하더라고 의미가 없다. 쉽게 말해서 아무런 결과도 보이지 않는다.
패스트캠퍼스 강의: https://bit.ly/3ilMbIO
'언어공부 > JAVA&SPRING' 카테고리의 다른 글
패스트캠퍼스 Java 웹 개발 마스터 올인원 패키지 Online. 챌린지 참여 후기 (0) | 2020.10.14 |
---|---|
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 50회차 미션 (0) | 2020.09.28 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 48회차 미션 (0) | 2020.09.26 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 47회차 미션 (0) | 2020.09.25 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 46회차 미션 (0) | 2020.09.24 |
댓글