Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

참새의 이야기

Chapter 1. 자바의 변화 본문

JAVA/모던 자바 인 액션

Chapter 1. 자바의 변화

참새짹짹! 2023. 11. 14. 11:07

자바 8은 병렬 연산을 위해 스트림 API를 지원한다.

이 스트림 API 덕분에 메서드에 코드를 전달하는 기법(메서드 참조와 람다)과 인터페이스의 디폴트 메서드가 존재할 수 있다.

스트림 처리

스트림을 정의하자면 ‘한 번에 하나씩 만들어지는 연속적인 데이터 항목들의 모임’이다.

자바 8의 java.util.stream 패키지에는 Stream Interface가 존재한다.

Stream<T>는  T 형식으로 구성된 일련의 항목을 의미한다.

이 스트림에 대하여 스트림 API는 많은 메서드를 제공하고, 이를 조합하여 스트림 파이프라인을 구성하여 사용하게 된다.

덕분에 스레드를 활용하지 않아도 스트림이 알아서 병렬적인 처리를 해준다.

동작 파라미터화: 메서드에 코드 전달하기

코드를 API로 전달하는 기능이다.

sort 명령을 예로 들어보자.

오름차순, 내림차순 등 sort의 기준은 필요에 따라 달라지지만, sort의 기본적인 동작은 미리 정해져 있다.

그렇다면 원하는 기준에 따라 sort 하려면, sort 메서드에 명령을 내려야 한다.

이런 경우 메서드의 동작을 파라미터로 전달하는 것을 동작 파라미터화라고 한다.

병렬성과 공유 가변 데이터

병렬성에서의 가장 큰 이슈는 공유된 가변 데이터에 대한 처리일 것이다.

기존에는 synchronized 키워드로 공유된 가변 데이터를 보호해야 했다면, 스트림 API를 사용한다면 쉽게 병렬성을 활용할 수 있다.

자바 함수

메서드와 람다를 값으로 취급

이미 다양한 언어들이 메서드와 람다를 값으로 취급할 수 있도록 발전했다.

public static void main(String[] args) {
    Trader trader1 = new Trader("홍길동", "서울");
    Trader trader2 = new Trader("홍동길", "부산");
    Trader trader3 = new Trader("길동홍", "제주");
    List<Trader> traders = Arrays.asList(trader1, trader2, trader3);

    traders.stream()
            .map(Trader::getName)
            .forEach(System.out::println);
}

이 예시를 보면 Trader의 getName()이라는 메서드를 메서드 참조를 통해 값으로 활용한다.

람다: 익명 함수

어떤 값 x에 1을 더하는 작업을 해주고 싶다면 x → x+1 와 같은 코드로 수행할 수 있다.

직접 메서드를 구현해도 되지만, 사용할 수 있는 클래스나 메서드가 없을 때 이러한 익명 함수를 사용하면 간결하게 코드를 구현할 수 있다.

스트림

스트림 API를 사용하면 컬렉션 API를 사용한 코드와 달리 반복 과정을 직접 처리하지 하지 않아도 된다.

for-each를 이용해야 했던 코드를 스트림 API에서는 라이브러리 내부에서 모두 처리해 준다.

이를 내부 반복이라고 한다.

컬렉션 API를 사용할 때와 달리 병렬적으로 처리되므로 시간적인 면에서의 장점도 있다.

자바 8은 ‘컬렉션을 처리하며 발생하는 모호함과 반복적인 코드 문제’, ‘멀티코어 활용의 어려움’이라는 문제를 모두 해결했다.

컬렉션을 사용한 데이터 처리에서 반복되는 패턴이 너무 많았고 이런 패턴을 제공하면 좋을 것이라는 아이디어가 스트림 API에서 나타난다.

필터링, 추출, 그룹화를 처리할 수 있는 간단한 기능들은 어떤 계산을 할 것인지에 중점을 둔다.

'JAVA > 모던 자바 인 액션' 카테고리의 다른 글

Chapter 5. 스트림 활용  (1) 2023.11.18
Chapter 4. 스트림 소개  (1) 2023.11.16
Chapter 3. 람다 표현식  (0) 2023.11.15
Chapter2. 동작 파라미터화  (2) 2023.11.14