본문 바로가기

백엔드 기술/Java

컬렉션과 스트림의 차이

 

#컬렉션 프레임 워크

#컬렉션은 여러 데이터들의 집합을 나타내며,
#컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가하고, 검색하고, 수정하고, 삭제하는 등의
메서드들을
미리 정의해놓고 이를 제공하는 기능이다.

 

#스트림

배열, 컬렉션의 저장 요소를 하나 씩 참조해서 '람다식'으로 처리할 수 있도록 해주는 반복자.
즉 List, Set, Map, 배열 등의 데이터들을 흐름에 따라 우리가 원하는 결과로 가공하고 처리할 수 있다.

#데이터 처리 연산을 지원하도록 #소스(컬렉션(List, Set), 배열)에서 추출된 #연속된 요소로 정의 한다.

 

#데이터 처리 연산

filter, map, reduce, find, match, sort 등의 메서드를 통해 데이터를 조작할 수 있다.

#소스

컬렉션(List, Set), 배열 등의 데이터 제공 소스로부터 데이터를 소비한다.
정렬된 컬렉션(List, Set)으로 스트림을 생성하면 정렬이 그대로 유지되며, 
List로 스트림을 만들면 스트림의 요소는 List의 요소와 같은 순서를 유지한다.

#연속된 요소

특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공.
#컬렉션(List, Set)은 자료 구조이므로,
시간과 공간의 복잡성과 관련된 데이터 저장(add) 및 데이터 호출(get) 연산이 주를 이룬다.
#스트림은 filter, map, sorted처럼 표현 계산식이 주를 이루며,
정리하면 #컬렉션의 주제는 데이터이고, #스트림의 주제는 계산 이다.

 

[특징]

1. 원본 데이터 소스를 변경하지 않는다.
2. 일회용 이다.
3. 내부 반복자 이다.
#외부 반복자 : 개발자가 코드로 직접 작성해서 컬렉션 요소를 반복해서 가져오는 형태
#내부 반복자 : 데이터 처리 코드만 컬렉션 내부로 주입해서 처리하는 형태

 

[결론]

#컬렉션은 자료 구조에 따른 데이터를 다루는 메서드를 모아놓은 프레임워크 이고,
#스트림은 컬렉션의 데이터를 필요에 따라 가공하여 사용 처리하는 방법이다.

 

[사용 비교 예시]

조건 : 제품군 중에 가격이 10만원 미만의 제품들만 간추리고 싶다.

#컬렉션 사용

public class Main {
    public static void main(String[] args) {
        HashMap<String,Integer> product = new HashMap<>();
        
        product.put("TV",100000);
        product.put("AC",150000);
        product.put("RR",80000);
        product.put("Phone",60000);

        for(Map.Entry<String, Integer> entry : product.entrySet()) {
            int price = entry.getValue();
            if (price < 100000) {
                System.out.println(entry.getKey()+": "+price);
            }
        }
    }
}

1. HashMap 객체를 생성하고 Key, Value의 데이터를 넣는다.
2. .entrySet() 메서드를 HashMap 객체 product에 사용하여
product의 Key-Value 데이터를 set 형태의 Map.Entry 타입인 entry 변수를 생성하여 할당.
3. 새로 생성된 product의 set 형태인 Map.Entry 객체를 사용해서 그 value만 가져와 int price를 만듬.
4. price를 비교값 100000이랑 비교하고 통과되면 해당하는 key 와 price를 출력한다.

#스트림 사용

public class Main {
    public static void main(String[] args) {
        HashMap<String,Integer> product = new HashMap<>();
        
        product.put("TV",100000);
        product.put("AC",150000);
        product.put("RR",80000);
        product.put("Phone",60000);

        product.entrySet().stream()
                .filter(e -> e.getValue() < 100000)
                .forEach(e -> System.out.println(e.getKey()+": "+e.getValue()));
    }
}

1. HashMap 객체 product 생성 후 Key, Value의 데이터를 넣는다.
2. stream()은 Map 인터페이스에는 사용이 안되고 컬렉션(List, Set) 인터페이스에서만 사용이 가능
3. 그래서 HashMap product를 set형태의 Entry.Map 객체로 바꿔서 stream을 사용한다.
4. stream() 메서드 중 filter(), forEach() 메서드로 원하는 데이터의 조건을 만들고 출력하여 구현.

>> 컬렉션 VS Stream 비교를 하면 Stream이 더 간결하고, 가독성이 좋다.

'백엔드 기술 > Java' 카테고리의 다른 글

컴파일(Compile)과 런타임(Runtime)  (0) 2023.04.20
Java - Generic 제네릭이란 ?  (0) 2023.04.20
자료 구조에서 Array VS List  (0) 2023.04.18
List, Set, Map 의 차이점  (0) 2023.04.18
생성자란 ?  (0) 2023.04.17