본문 바로가기
공부 일지/프로그래밍 언어

[JAVA] 스트림(Stream)

by Joshbla 2023. 1. 15.

스트림(Stream)

스트림이란 배열이나 컬렉션의 요소들을 하나씩 참조하여 람다식으로 처리할 수 있게 해주는 반복자이다.

 

스트림의 장점

  1. 선언형 프로그래밍: 쉽고 직관적인 코드
  2. 병렬처리: 성능 개선
  3. 통합된 데이터 처리

스트림 이전에는 배열이나 컬렉션의 요소를 다루는 방법은 for문 또는 Iterator등을 이용하는 것이있었다.

이는 코드가 길고 복잡해질 수 있다는 단점이 존재한다.

 

스트림은 선언형 프로그래밍 방식으로 데이터를 처리할 수 있어서 보다 직관적인 코드를 작성할 수 있다.

더보기

선언형 프로그래밍: "무엇"에 초점을 둔다. 동작원리를 모르더라도 코드의 역할에 대해 직관적으로 이해할 수 있다.

명령형 프로그래밍: "어떻게"에 초점을 둔다. 코드의 동작원리를 이해하고 내부에서 어떻게 돌아가는지 이해하여야한다.

또 병렬 처리를 별도의 멀티스레드 구현없이 구현할 수 있다. (parallel 메서드 사용)

 

이전 방식을 사용하면 데이터종류에 따라서 다른 메서드를 쓰는 경우가 있다.

예를들어 정렬을 한다고 했을 때 배열의 경우는 Arrays.sort()를 사용하고 List의 경우는 Collections.sort()를 사용한다.

스트림을 사용하면 이렇게 따로 메서드를 사용하지 않아도 된다.

 

스트림의 특징

  1. 람다식을 사용하여 코드가 간결해진다.
  2. 내부반복자를 사용하여 병렬처리가 쉽다.
    더보기
    외부반복자: for문이나 Iterator 처럼 index를 통해 요소를 가져와서 처리하는 방식
    내부반복자: collection 내부에서 요소를 반복시켜 처리하는 방식
  3. 연산처리 파이프라인이 존재한다.
    - 생성 연산
    - 중간 연산: 필터링, 매핑, 정렬 등...
    - 최종 연산: 총합, 평균, 카운팅, 매 등...
  4. 일회용이므로 재사용이 불가능하다.
  5. 원본 데이터를 변경하지 않는다. (read-only)
    필요에 따라 결과를 따로 반환시킬 수 있다.

사용 예시

List<Member> list=Arrays.asList(
        new Member("짱구",Member.MALE,5),
        new Member("영희",Member.FEMALE,5),
        new Member("짱아",Member.FEMALE,1),
        new Member("코난",Member.MALE,7));

        double ageAvg=list.stream()                 // 생성연산
        .filter(m->m.getGender()==Member.MALE)   // 중간 연산
        .mapToInt(Member::getAge)               // 중간 연산
        .average()                                // 최종 연산
        .getAsDouble();

 

'공부 일지 > 프로그래밍 언어' 카테고리의 다른 글

Spring AOP  (0) 2023.03.23
[JAVA] 가비지 컬렉션(Garbage Collection)  (3) 2023.03.17
[JAVA] 람다식(Lambda Expression)  (0) 2023.01.12
[JAVA] 컬렉션 프레임워크  (0) 2023.01.11
[JAVA] 열거형 / 제너릭  (0) 2023.01.10