자바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. 가변 공유 상태가 없는 병렬 실행을 이용해서 효율적이고 안전하게 함수나 메서드를 호출 할 수 있다는 점
'개발공부 > JAVA' 카테고리의 다른 글
모던 자바인 액션 : 스트림 (0) | 2022.09.13 |
---|---|
[인프런강의] 더 자바, 자바8 : 2강 (0) | 2022.08.21 |
Spring Initializr로 Spring Boot 프로젝트 생성하는 방법 (0) | 2022.08.21 |
[인프런강의] 더 자바, 자바8 1강 (0) | 2022.08.20 |
[JAVA] Jsoup 사용하여 네이버 주가 크롤링 (소스포함) (7) | 2021.07.13 |