자바 8이 등장하면서 프로그래머가 좋아할 내용을 알아보겠습니다.
자바 8로 오면서 편리한 기능을 제공하게 되었습니다. 스트림, 비동기 논블로킹, 함수형 프로그래밍 등을 제공합니다. 왜 이런 기능을 자바 8에서 도입 했을까요? 프로그래머는 대용량 데이터를 다루어야 하는 도전에 직면했기 때문입니다. 이른바 빅데이터! 대용량 데이터는 단일 코어로 다루기에는 턱없이 부족했습니다. 그래서 코어의 수를 늘리기 시작합니다. 코어가 늘어나니 작업을 병렬로 처리할 수 있게 됩니다. 이후 자바 8에서는 비동기 논블로킹 그리고 함수형 프로그래밍을 도입하게 됩니다.
자바 8에서 제공하는 기능 몇 가지를 살펴보겠습니다. 메서드에 메서드를 인수로 전달이 가능해졌습니다. 이를 동작 파라메타화(behavior parameterization)이라고 합니다. 지금은 자주 사용해서 몰랐겠지만, 자바 8 이전에는 메서드에 인수로 메서드를 넣을 수 없었습니다. 메서드와 유사한 람다도 넣을 수 있습니다. 간단한 예시를 보겠습니다.
fruits 인스턴스에 과일 리스트가 있다고 가정합니다. 그 과일들 중에서 섞은 과일을 골라서 담는 것입니다. 기존 방식은 FruitFilter로 isRotten()을 감싸서 전달하고 있습니다. 그러나, 새로운 방식은 Fruit에 있는 isRotten 메소드를 바로 참조하여 사용할 수 있습니다. 아주 멋지지 않습니까?
// 기본 방식
Fruit[] rottenFruits = fruits.getFruits(new FruitFilter() {
public boolean accept(Fruit fruit){
return fruit.isRotten();
}
})
// 메서드 참조
Fruit[] rottenFruits = fruit.getFruit(Fruit::isRotten);
자바 8에서 제공하는 다음 기능은 병렬 처리입니다. 스트림 API를 통해서 멀티 스레드 활용의 어려움 문제를 해결했습니다. 아래 그림을 보면 이해하기 쉬울 겁니다. 5개의 사과 리스트를 필터링하는 것입니다. 2개의 CPU가 있으면, 앞에 3개는 CPU 1이 처리하고, 뒤에 CPU2는 나머지 2개를 처리합니다. 그리고 합치면, 짜잔~ 결과가 나옵니다.
코드 예시는 아래와 같습니다. busket에 리스트로 담겨있는 사과를 stream으로 바꿔주고, filter와 collect 파이프라인을 만들어 줍니다. parallelStream으로 작업을 병렬 처리해 줄 수 있습니다. 당도가 10 이상인 사과만 모아서 collect()가 다시 리스트로 만들어 줍니다.
List<Apple> sweetApples = busket.parallelStream()
.filter((Apple a) -> a.getSweet() > 10)
.collect(toList());
끝.
'IT > Java' 카테고리의 다른 글
Arrays.asList() vs ArrayList() (0) | 2022.12.19 |
---|---|
팩토리 패턴 (Factory Pattern) (0) | 2022.11.07 |
[함수형 데이터 처리] 스트림 (2) | 2022.09.25 |
기본형과 참조형 변수 (0) | 2022.09.04 |
동작 파라미터화 (0) | 2022.08.13 |