Stream

신지훈·2023년 11월 8일
0

자바 로드맵

목록 보기
1/2

스트림이란?

스트림이란 자바 8 API에 새로 추가된 기능으로 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수 있다.

데이터 처리 연산
스트림은 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 데이터베이스와 비슷한 연산을 지원한다. 예를 들어 filter, map, reduce, find, match, sort 등으로 데이터를 조작할 수 있다. 스트림 연산은 데이터를 순차적으로 또는 병렬로 실행할 수 있다.

소스
스트림은 컬렉션, 배열, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다. 정렬된 컬렌션으로 스트림을 생성하면 정렬이 그대로 유지된다. 즉, 리스트로 스트림을 만들면 스트림의 요소는 리스트의 요소와 같은 순서를 유지한다.

연속된 요소
컬렉션과 마찬가지로 스트림은 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다. 컬렉션은 자료구조이므로 컬렉션에서는 시간과 공간의 복잡성과 관련된 요소 저장(ex: add) 및 접근(ex: get) 연산이 주를 이룬다. 반면, 스트림은 filter, map, sorted처럼 표현 계산식이 주를 이룬다. 정리하면, 컬렉션의 주제는 데이터이고, 스트림의 주제는 계산이다.
출처: https://zangzangs.tistory.com/171 [장장스:티스토리]

스트림의 특징

  1. 자료에 대한 스트림을 생성하면 스트림이 사용하는 메모리 공간을 별도로 생성되므로 연산이 수행되어 기존 자료에 영향을 미치지 않는다.

  2. 한번 생성하고 사용된 스트림은 재사용할 수 없으며 연산을 수행하면 스트림은 소모된다.

스트림 연산의 종류

스트림 연산은 중간 연산과 최종 연산으로 구분 됨

중간연산: 여러 개의 연산이 적용될 수 있지만 최종 연산은 마지막에 한 번만 적용됨(filter,map...)

최종연산: 최종연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 결과가 만들어짐(=중간연산에 대한 내용을 중간에 알 수 없음)(forEach, toArray...)

람다식, 이중 콜론 연산자

스트림을 사용하다 보면 () -> {}과 :: 등의 함수를 볼 수 있다. 이는 각각 람다식과 이중 콜론 연산자이다.

  1. 람다식: 익명 함수를 지칭하는 용어로 함수를 보다 간단하게 표현하는 방법이다.

    -사용 방법

    일반 함수 표현

    int add(int x, int y){
    
        return x+y;
    }
    

    람다식 표현

    (int x, int y) -> {return x+y;}
  1. 이중 콜론 연산자: 람다식에서 파라미터를 중복해서 사용하고 싶지 않을 때 사용하고,
    람다식과 동일한 처리 방법을 갖긴 하지만, 이름으로 기존 메소드를 참조함으로써 더욱 보기 쉽게 사용할 수 있다

    -사용 방법
    [인스턴스]::[메소드명(or new)]
    ex) User::getId

    1) 람다 표현식 () -> {} 에서만 사용 가능하고
    2) static 메소드인 경우 인스턴스 대신 클래스 이름으로 사용할 수도 있다.

자세한 내용은 이글을 참고하세요

스트림 생성 및 사용법

public static class Food {
	string name;
    int price;
    
    public Food(string name, int price){
    	this.name = name;
    	this.price = price;
    }
    
    public string getName() {
    	return name;
    }
    
    public string getPrice() {
    	return price;
    }
    

}



List<String> food = food.stream()
		.filter(a -> a.getPrice() > 10000)
        .map(Food::getName)
        .collect(Collectors.toList());

스트림은 배열뒤에 .stream()을 붙여 스트림을 생성할 수 있다. 이를 통해 리스트 안에 있는 객체들을 가지고 내부 반복을 통해 원하는 컬렉션을 만들어 낼 수 있다. 해당 스트림에서 사용된 함수들을 살펴보면 filter와 map은 스트림의 중간연산자로 사용되었고 collect는 최종연사자로 사용되었다.
filter 안에는 람다식을 이용하여 조건에 맞는 객체를 걸러냈고, map에 이중 콜론 연산자를 하용하여 각각의 Food객체에서 이름을 가져와 최종 연산자를 통해 리스트를 만들었다.

느낀점

스트림의 사용방법과 작동원리를 정확하게 모르고 사용했었다. 그래서 이번에 스트림 사용법을 자세히 정리하고 싶었다. 하지만 스트림 사용법에 대한 자세한 내용을 담는 것보다 스트림에서 사용되는 기술을 들어다보는 것이 전체적인 원리를 이해하는데 도움이 되었다. 그리고 이런 원리들을 바탕으로 직접사용해보면서 사용법을 익힌다면 유용하게 사용할 수 있을 것 같다.

profile
주주주주니어 개발자

0개의 댓글