스트림(Stream)이란?
자바 8에서 추가한 스트림(Stream)은 람다를 활용할 수 있는 기술 중 하나이다. 자바 8 이전에는 배열 또는 컬렉션 인스턴스를 다루는 방법은 for
또는 foreach
문을 돌면서 요소 하나씩을 꺼내서 다루는 방법이었다. 간단한 경우라면 상관없지만 로직이 복잡해질수록 코드의 양이 많아져 여러 로직이 섞이게 되고, 메서드를 나눌 경우 루프를 여러 번 도는 경우가 발생한다.
스트림은 '데이터의 흐름' 이다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 또한 람다를 이용해서 코드의 양을 줄이고 간결하게 표현할 수 있다. 즉, 배열과 컬렉션을 함수형으로 처리할 수 있다.
Iterator과 비슷한 역할을하지만 람다식으로 요소 처리 코드를 제공하여 코드가 좀 더 간결하게 할 수 있다는 점과 내부 반복자를 사용하므로 병렬 처리가 쉽다는 점에서 차이가 있다.
또 하나의 장점은 간단하게 병렬처리(multi-threading)가 가능하다는 점입니다. 하나의 작업을 둘 이상의 작업으로 잘게 나눠서 동시에 진행하는 것을 병렬 처리(parallel processing)라고 합니다. 즉 스레드를 이용해 많은 요소들을 빠르게 처리할 수 있습니다.
스트림에 대한 내용은 크게 세 가지로 나눌 수 있습니다.
- 생성하기 : 스트림 인스턴스 생성.
- 가공하기 : 필터링(filtering) 및 맵핑(mapping) 등 원하는 결과를 만들어가는 중간 작업(intermediate operations).
- 결과 만들기 : 최종적으로 결과를 만들어내는 작업(terminal operations).
람다식(Lambda Expressions) -> 사용법
Iterator 과 Stream의 코드 비교
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
Iterator<Integer> iter = list.iterator();
while(iter.hasNext()) {
int num = iter.next();
System.out.println("값 : "+num);
}
자바 6 이전까지는 ArrayList에서 요소를 순차적으로 처리하기 위해 iterator 반복자를 위와 같이 사용했다.
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
Stream<Integer> stream = list.stream();
stream.forEach(num -> System.out.println("값 : "+num));
하지만 위와 같이 자바 8부터 추가된 스트림을 사용하면 훨씬 단순하게 코딩할 수 있다. 자바 8 이후에 작성된 코드에서는 람다식으로 기술된 부분에는 꼭 Stream이 들어가는 부분이 많다.
Stream(스트림) 사용법
배열에서의 스트림 활용
//String 배열
String[] strArray = { "홍길동", "이순신", "임꺽정"};
Stream<String> strStream = Arrays.stream(strArray);
strStream.forEach(a -> System.out.print(a + ","));
System.out.println();
//int 배열
int[] intArray = { 1, 2, 3, 4, 5 };
IntStream intStream = Arrays.stream(intArray);
intStream.forEach(a -> System.out.print(a + ","));
System.out.println();
홍길동, 이순신, 임꺽정,
1,2,3,4,5,
클래스에서의 스트림 활용
class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() { return name; }
public int getScore() { return score; }
}
public class FromCollectionExample {
public static void main(String[] args) {
List<Student> studentList = Arrays.asList(
new Student("홍길동", 10),
new Student("이순신", 20),
new Student("임꺽정", 30)
);
Stream<Student> stream = studentList.stream();
stream.forEach(s -> System.out.println("이름 : "+ s.getName()));
}
}
이름: 홍길동
이름: 이순신
이름: 임꺽정
'Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 (0) | 2022.10.31 |
---|---|
[Java] Optional 이란? (1) | 2022.10.23 |
[Java] 람다식? (0) | 2022.10.18 |
[Java] 쓰레드(Thread) (0) | 2022.10.17 |
[Java] Try-catch 문이란? (예외처리) (0) | 2022.10.17 |