[Java] Java8 Stream API (1)

한호성·2023년 2월 27일
0

Java Stream API

목록 보기
1/3

Introduction

실무 개발 중에 Java8 에서 도입 된 Stream 기능을 유용하게 사용하여, Java Collection frameworks의 자료구조를 편하게 사용하였습니다. Stream API를 더 유용하게 사용하고, 자세한 동작원리를 알기 위해, 공부한 글입니다.
[목차]

  • Java Stream API 나오게 된 배경
  • Java Stream API 개념 및 특징
  • Java Stream API 다양한 사용법
  • Java Stream API 사용시 고려해야 할점

Java Stream API 나오게 된 배경

Java Stream API를 처음 조사하기 시작하면서, 요즘 핫한 ChatGPT를 활용하여 질문하였습니다. 질문은, "Java8 에 Stream API 왜 도입되었고, 이전 버전과 어떤 점이 다른지 비교해달라고 하였습니다."

그 결과는 다음과 같습니다.

요약 하자면,

Java Data Collections을 효율적으로 다루기 위해 추가되었다고 하고,
코드 가독성, 성능향상, 쉬운 사용, 유연성 증가를 장점으로 이야기 해주었습니다.

추가적으로, 공식문서에 간단한 설명을 보도록 하겠습니다.

Java Collection의 요소를 Stream을 통해 함수형 연산을 지원하는 패키지라고 설명에 나와있습니다.

#cf) 함수형 스타일에 대해서는 좀 더 조사해서 글을 따로 쓰도록 하겠습니다.

자바 8버전 이전까지는, Iterator(for, foreach) 를 활용하여, Collection을 순회하면서 값을 찾아와 사용하였습니다. 반면 Java8 부터는, Stream API가 도입되면서 위에서 말한 함수형 스타일인, 람다식을 활용하여, Collection의 stream 개체를 만들어서 활용할 수 있게 되었습니다.

간단한 코드를 예시를 보겠습니다.

위와 같이 두가지 형식으로 쓸 수 있습니다. 위의 for문이 이전, 아래의 forEach가 stream을 활용한 방식입니다. 이렇게만 보면 별 차이 없는데? 라고 생각하실 수 있습니다.

그렇다면 요구조건을 바꿔보도록 하겠습니다. arrayList에 포함된 문자열 중 a를 포함하고 있는 문자열을 출력해보도록 하겠습니다.

이제는 조금의 차이를 느끼실 수도,없을수도..? 있을거 같습니다. Stream의 활용법에 대해 보시게 되면, 복잡한 요구조건을 Stream API를 통해 간단하게 코딩할 수 있습니다.

정리하자면, Stream API가 나오게 된 배경에는, 다음과 같은 요구가 있었던 것으로 보입니다.

  • 병렬처리를 통한 성능 향상
  • 함수형 프로그래밍을 활용한 가독성 높은 코드처리
  • Collection 개체의 쉬운 활용

Java Stream API 개념 및 특징

Stream

Stream 이란 사전적 의미로, 흐르다,흐름, 개울 등의 의미를 갖고 있습니다. Java Stream API 에서 Stream은 데이터의 흐름을 의미합니다.

참고한 여러 글들 중에 Stream API의 의미를 사진으로 잘 표현한 사진이 있어서 첨부합니다.

사진을 보면, 데이터의 흐름(Stream)을 원하는대로 필터하고, 가공하여 최종으로 원하는 형태의 데이터로 바꾸는 것을 이해할 수 있습니다. 이런 기능을 하도록 해주는 것이 바로 Java Stream API 입니다. 아래의 Stream 활용하는 것을 다 공부하고 다시 사진을 보면 이해가 더욱 잘 됩니다~

cf) (I/O)에 사용되는 Stream과는 다른 Stream 입니다.

Stream 의 특징

  1. 원본의 데이터를 변경하지 않는다.

    Stream API는 원본의 데이터를 조회하여, 원본의 데이터가 아닌 별도의 요소들로 Stream을 생성합니다. 이런 특징 때문에, 원본의 데이터로부터 읽기만 할 뿐, 정렬,필터, 등등의 작업은 별도의 Stream 요소들에서 처리가 됩니다.

  2. Stream은 일회용이다.

    Stream들은 한번 사용하고 난 후,재사용이 불가능하기 때문에, 다시 만들어서 사용해야 합니다.

  3. 람다식의 요소 처리 코드를 제공한다.

    스트림은 람다식 또는 메소드 참조를 이용한다. 따라서, 코드가 간결해지는 장점이 있습니다. (이 부분에 대해서 추가 글써서 Link 달기 )

  4. 내부 반복자를 사용하여, 병렬 처리가 쉽다.

    외부 반복자란 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴을 의미한다. 우리가 흔히 사용하는 index 활용한 for문 , iterator를 활용한 반복문 등이 모두 이에 해당합니다.

    내부 반복자란 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야할 코드만 제공하는 패턴을 의미합니다. 내부 반복자는, 컬렉션 내부에서 요소를 스스로 반복시키기 때문에, CPU 코어를 최대한 활용하기 위해 요소들을 분배시켜 병렬작업이 가능하게 할 수 있습니다. (외부 반복자는 계속해서 요소에 대한 정보를 하나씩 주기 때문에 불가능하다고 이해했습니다)

  1. 중간처리와 최종처리가 존재한다.

    스트림은 컬렉션의 요소에 대한 중간처리와 최종처리를 할 수 있습니다.
    중간 처리에는 매핑,필터링,정렬, 최종처리에는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행합니다.


#cf) Java8 Stream API (2)편 에 이어서 다양한 사용법,및 고려해야 할점에 대해서 작성하도록 하겠습니다.

유의사항

학습하는 과정에서 스스로의 공부한 것을 정리하여 적은 글 입니다. 잘못된 부분이나 문제가 있는 부분은 피드백 주시면 감사하겠습니다 ^^*

Reference

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#package.description
https://futurecreator.github.io/2018/08/26/java-8-streams/
https://futurecreator.github.io/2018/08/26/java-8-streams-advanced
https://steady-coding.tistory.com/309
https://mangkyu.tistory.com/112

profile
개발자 지망생입니다.

0개의 댓글

관련 채용 정보