본문 바로가기

개발공부/JAVA

모던 자바인 액션 1장

자바8

- 스트림 API

- 메서드에 코드를 전달하는 기법

- 인터페이스의 디폴트 메서드

 

자바8 기법은 함수형 프로그래밍에서 위력을 발휘한다.

* 병렬성을 활용하는 코드, 간결한 코드를 구현

 

1.1 멀터코어 병렬성

1.2 코드를 메소드로 전달하는 기법의 강점

1.3 스트림API(병렬형 데이터를 표현하고 이들 데이터를 쉽게 병렬로 처리할 수 있음)

1.4 디폴트 메서드

1.5 JVM을 구성하는 자바 및 기타 언어에서 함수형 프로그래밍이라는 존재가 어떤 영향을 미치는지

 

1.2.2 스트림 처리

스트림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임

이론적으로 프로그램은 입력 스트림에서 데이터를 한 개씩 읽어 들이며 마찬가지로 출력 스트림으로 데이터를 한 개 씩 기록함.

자바 8에는 java.util.stream 패키지에 스트림 API가 추가됨.

우리가 하려는 작업을 고수준으로 추상화 하여 일련의 스트림으로 만들어 처리할 수 있음

스레드를 사용하지 않으면서도 공짜로 병렬성을 얻을 수 있다.

 

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

자바 8에서는 메서드를 다른 메서드의 인수로 넘겨주는 기능을 제공함 : 동작 파라미터 화

= 스트림 API는 연산의 동작을 파라미터화 할 수 있는 코드를 전달한다는 사상에 기초한다.

 

1.2.4 병렬성과 공유 가변 데이터

병렬성을 얻는 대신에 코드 동작 방식을 바꿔야함.

동시에 실행하더라도 안전하게 실행될 수 있어야함 -> 공유된 가변데이터에 접근 하지 않아야함.(= 순수함수)

물론 기존의 synchronized를 이용해서 공유된 가변 데이터를 보호 가능하지만 성능 no good

* 함수형 프로그래밍의 핵심 : 공유되지 않는 가변 데이터, 메서드, 함수 코드를 다른 메서드로 전달하는 두가지 기능

 

1.2.5 자바가 진화해야하는 이유

제네릭, for-each ... 공부

 

1.3 자바 함수 

1.3.1 메서드와 람다를 일급 시민으로

* 메서드 참조를 이용해서 직접 전달 가능

기존 소스

File[] hiddenFiles = new File(".").listFiles(new FileFilter(){

public boolean accept(File file){

return file.isHidden();

}

})

자바 8을 적용한 소스

File[] hiddenFiles = new File(".").listFiles(File::isHidden);

 

* 람다 : 익명 함수

자바 8에서는 람다를 포함하여 함수도 값으로 취급 가능 

ex) (int x) -> x + 1;

 

특정 항목을 선택해서 반환하는 동작을 필터라고 함

ex) apple.getWeight() > 150 이면 무거운 사과

코드를 인수로 넘겨 줄 수 있으므로 filter 메소드 중복으로 구현할 필요가 없음.

이렇게 사용 가능 -> filterApples(inventory, Apple::isHeavyApple);

만약 한번만 사용할 메소드일 경우 -> filterApples(inventory,(Apple a) -> a.getWeight() > 150 );

 

1.4 스트림

컬렉션 API를 사용할 경우 : foreach문을 사용하여 각 요소를 반복하면서 작업을 수행함(외부반복)

스트름 API를 사용할 경우 : 라이브러리 내부에서 모든 데이터가 처리됨(내부반복)

 

1.4.1 멀티스레딩은 어렵다

이전 멀티스레딩 환경에서는 각각의 스레드가 동시에 공유된 데이터에 접근하고, 데이터를 갱신하기 때문에 스레드를 잘 제어하지 못하면 원치 않는 방식으로 데이터가 바뀔수 있다.

자바8은 스트림 API로 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제 그리고 멀티코어 활용 어려움이라는 두 가지 문제를 모두 해결했다.

반복되는 패턴으로

1. 필터링하거나

2. 데이터를 추출하거나

3. 데이터를 그룹화 하거나(리스트에서 숫자를 홀수와 짝수로 그룹화 ) 를 쉽게 병렬화 할수 있음

 

포킹단계란?

두 CPU를 가진 환경에서 리스트를 필터링 할때 한 CPU는 리스트의 앞부분을 처리하고, 다른 CPU는 다른 CPU의 뒷부분을 처리하도록 요청할 수 있는 것.

 

컬력션은 어떻게 데이터를 저장하고 접근할지 중점을 둠

스트림은 데이터에 어떤 계사을 할 것인지 묘사하는 것에 중점을 두며, 스트림 내의 요소를 쉽게 병렬로 처리하는 환경을 제공해줌.

 

 

1.5 디폴트 메서드와 자바 모듈

- 인터페이스를 쉽게 바꿀수 있도록 디폴트 메서드를 지원한다. 디폴트 메서드는 특정 프로그램을 구현하는 데 도움을 주는 기능이 아닌 미래에 프로그램이 쉽게 변화할 수 있는 환경을 제공해준다. 디폴트 메서드를 이용하면 기존의 코드를 건드리지 않고도 원래의 인터페이스 설계를 자유롭게 확장할 수 있다. 자바 8에서는 인터페이스 규격명세에 default라는 새로운 키워드를 지원한다.
*default 메소드 알아보기

 

 

함수형 프로그래밍의 핵심 아이디어

1. 메서드와 람다를 일급값으로 사용하는 것

2. 가변 공유 상태가 없는 병렬 실행을 이용해서 효율적이고 안전하게 함수나 메서드를 호출 할 수 있다는 점