java - stream

yunzivv·2025년 3월 18일

JAVA 기초

목록 보기
20/23

stream


강사님이 stream을 사용한 코드를 보여주셨는데
Array.stream.filter(d -> int d).mapToInt(e) ··· 뭐 대충 이런 식이었다. 계속 .으로 이어지고 메서드를 계속 호출하는 형식인 것 같았다. 수업 내용으로는 이해가 잘 안되서 자세히 알아보고 정리한다.

자바에서 컬렉션(배열, 맵 등)을 생성하고 접근할 땐 반복문을 사용하고, 각 컬렉션 클래스에는 같은 기능을 하는 메서드들이 중복해서 정의되어 있다. 데이터 타입마다 다 다른 방식으로 다뤄야 한다.

컬렉션(Collection) : 많은 데이터를 그 사용 목적에 적합한 자료구조로 묶어 하나로 그룹화한 객체

이럴 때 stream을 사용한다. 스트림은 데이터를 읽거나 쓰기 위한 데이터의 흐름이다.
스트림을 사용하면 데이터 소스를 구분하지 않고 같은 방식으로 다룰 수 있고, 코드의 재사용성이 높아진다. 반복문을 사용하지 않고도 자료구조에 순차적으로 접근하고, 접근한 요소에 메서드를 실행할 수 있다.


스트림 특징


  1. 데이터를 추상화한다.
    • 데이터 타입에 상관 없이 같은 방식으로 데이터를 처리할 수 있다.
  2. 일회용이다.
    • 다시 사용하려면 새로 생성해야 한다.
  3. 컬렉션의 가장 상위 Collection에 정의되어 있다.
    • Collection의 모든 자손은 스트림을 사용할 수 있다.
  4. 기본형 스트림을 제공한다. (Integer -> int)
    • 오토박싱과 언박싱의 과정을 생략한다.
  5. 작업을 내부 반복으로 처리한다.
    • 반복문을 메서드 내부에 숨긴다.
  6. 코드가 간결하고 가독성이 좋아진다.

컬렉션과 스트림 차이

컬렉션 -> 외부 반복 : 사용자가 직접 반복문을 사용해서 요소에 접근한다.
스트림 -> 내부 반복 : 반복을 알아서 처리하고 결과 스트림값을 기억한다.

스트림 메서드


스트림의 메서드는 중간 연산 메서드최종 연산 메서드 2가지로 분류된다.

중간 연산(Intermediate Operation)

  • 연산 결과가 스트림인 연산이기 때문에 연속해서 연산이 가능하다
  • 여러가지 메서드를 한 문장으로 실행할 수 있는 메서드 생각하면 쉽다.
  • 종류
    - filter() : 스트림의 요소를 검사하여 조건에 적합한 요소만을 걸러낸다.
    • map() : 스트림의 요소를 매핑하는 메서드다. 기존의 요소를 대체하는 새로운 스트림을 생성한다. (mapToInt : 스트림 요소를 정수형으로 변환하여 스트림으로 반환.)

최종 연산 메서드(Terminal Operation)

  • 연산결과가 스트림이 아닌 연산이다.
  • 스트림의 요소를 소모하기 때문에 단 한 번만 가능하다.
  • 한 문장에 하나의 메서드만 사용할 수 있다고 생각하면 쉽다.
  • 종류
    - forEach() : 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용한다.
    - sum() : 요소들의 합을 반환한다.
    - count() : 요소들의 개수를 반환한다.

람다식


메서드를 간결한 함수식으로 표현한 것이다. 자바에서 메서드를 표현하기 위해서 클래스를 정의하고, 반환 타입, 메서드명, 매개변수 타입 등 코드가 길어지는 문제점을 해결한 방안이다.
메서드 타입, 메서드명, 매개변수 타입, 중괗로, 반환식을 생략한다. 이를 대체하는 ->기호를 사용하여 단축한다. 익명 함수라고도 불린다.

int 

메서드 레퍼런스


람다식이 하나의 메서드만을 호출하는 경우 매개변수를 생략하여 사용할 수 있도록 한 것이다.
클래스명 :: 메서드명 또는 참조변수명 :: 메서드명 형식으로 사용한다.
메서드를 호출하지만 괄호()는 생략한다.

람다식과 메서드 레퍼런스는 사용을 자주해서 어떤 순간에 활용하는 것이 좋은 지 직접 느껴야 할 것 같다. 아직 스트림은 완벽 정복한 게 아니라 첨부 파일이 많다..ㅎㅎ

참고 자료


stream 정리(map)
stream 정리
스트림 메서드
stream 람다식
스트림 1/5

0개의 댓글