일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CQRS
- head first
- spring Batch
- Java
- Was
- AWS101
- Java8
- Stream
- spring
- 스트림
- 클린코드
- Java 8 in action
- jsp
- 디자인 패턴
- SERVLET
- web
- 자바8
- 자바의 신
- 자바8인액션
- 패스트캠퍼스
- 자바
- domain
- Clean Code
- Java in action
- Template Method Pattern
- ddd
- Design Pattern
- facade pattern
- spring boot
- Java8 in action
- Today
- Total
주난v 개발 성장기
[자바 8 인 액션] 1장. 자바 8을 눈여겨봐야 하는 이유 본문
자바 8에서 변화가 많이 일어났다.
사과 리스트 정렬 코드
//JAVA8 이전
Collections.sort(inventory, new Comparator<Apple>() {
public int compare(Apple apple1, Apple apple2) {
return apple1.getWeight().compareTo(apple2.getWeight());
}
}
//JAVA8
inventory.sort(comparing(Apple::getWeight());
멀티코어 CPU 대중화와 같은 하드웨어적인 변화도 자바 8에 영향을 미쳤다.
대부분 쿼드 코어 이상의 CPU를 사용할 것이다.
자바8이 등장하기 이전에는 나머지 코어를 활용하려면 스레드를 사용하는 것이 좋다고 조언했지만, 관리하기 어렵고 문제가 발생
자바 1.0 - 스레드와 락
자바 1.5 - 스레드 풀, 병렬 실행 컬렉션
자바 1.7 - 포크/조인 프레임워크
모든 것을 활용하기는 쉽지 않았다.
간결한 코드와 멀티코어 프로세서의 간단한 활용 - 자바8의 핵심적인 사항
자바 8에서 제공하는 새로운 기술
-
스트림 API : 병렬 연산 지원
- Synchronized를 사용하지 않아도 된다. -
메서드에 코드를 전달하는 기법 (동작 파라미터화)
- 다른 두 메서드가 있을 때, 하나의 메서드로 합치는 것이 바람직할 수 있다.
메서드에 코드를 전달하는 기법으로, 함수형 프로그래밍에서 위력을 발휘한다. -
인터페이스와 디폴트 메서드
스트림 처리
한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임.
java.util.stream 패키지에 존재
스트림 파이프라인을 이용해서 입력 부분을 여러 CPU 코어에 쉽게 할당 할 수 있다.
--> 스레드를 사용하지 않으면서, 공짜로 병렬성을 얻을 수 있다.
동작 파라미터화
코드 일부를 API로 전달하는 기능
병렬성과 공유 가변 데이터
'병렬성을 공짜로 얻을 수 있다'
- 스트림 메서드로 전달하는 코드는 다른 코드와 동시에 안전하게 실행될 수 있어야 한다.
- 보통 다른 코드와 동시에 실행하더라도 안전하게 실행할 수 있는 코드를 만들려면, 공유된 가변 데이터에 접근하지 않아야 한다.
--> 이러한 함수를 순수함수, 부작용 없는 함수, 상태 없는 함수라고 부른다.
물론 기존처럼 Synchronized를 이용해서 공유된 가변 데이터를 보호할 수 있지만, 성능에 악영향을 미친다.
또한 코드를 순차적으로 실행시키며 병렬이라는 목적을 무력화 시킨다.
자바 함수
함수는 메서드 특히 정적 메서드의 의미를 가진다.
그러나 자바 8에서는 함수를 새로운 값의 형식으로 추가했다.
자바 프로그램에서 조작 할 수 있는 값은 기본값, 객체값(일급 값)
메서드와 람다를 일급 시민으로
- 메서드 레퍼런스(이 메서드를 값으로 사용하라)
1. FileFilter 객체로 isHidden 메서드를 감싼 다음에, File.listFiles 메소드로 전달
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
}
File[] hiddenFiles = new File(".").listFiles(file::hidden);
:: 문법을 이용해서, 직접 isHidden 함수를 listFiles 메서드로 전달
람다:익명함수
자바 8에서는 메서드를 일급값으로 취급할 뿐만 아니라 람다를 포함하여, 함수도 값으로 취급할 수 있다.
람다 형식으로 구현된 프로그램을 함수형 프로그래밍, 즉 '함수를 일급값으로 넘겨주는 프로그램을 구현한다.'
특정 항목을 선택해서 반환하는 필터
public static List<Apple> filterGreenApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if ("green".equals(apple.getColor())){
result.add(apple);
}
}
return result;
}
public static List<Apple> filterHeavyApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (apple.getWeight() > 150){
result.add(apple);
}
}
return result;
}
필터 메서드가 중복 구현되고 있다.
public static boolean isGreenApple(Apple apple){
retrun "green".equals(apple.getColor();
}
public static boolean isHeavyApple(Apple apple){
retrun apple.getWeight() > 150;
}
public interface Predicate<T> {
boolean test(T t);
}
public static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> predicate) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (predicate.test(apple) {
result.add(apple);
}
}
return result;
}
filterApples(inventory, Apple::isGreenApple);
filterApples(inventory, Apple::isHeavyApple);
메서드 전달에서 람다로
자바 8에서는 람다라는 새로운 개념을 이용해서 코드를 구현할 수 있다.
filterApples(inventory, (Apple apple) -> "green".equals(apple.getColor());
한 번만 사용할 메서드는 정의를 할 필요가 없다.
하지만 람다가 몇 줄 이상으로 길어진다면, 메서드를 정의하고 메서드 레퍼런스를 활용하는 것이 바람직하다.
스트림
거의 모든 자바 애플리케이션은 컬렉션을 만들고 활용한다.
52p 코드 처럼 코드를 줄 일 수 있다.
스트림 API를 사용하면, 컬렉션 API와 다른 방식으로 데이터 처리가 가능하다.
컬렉션에서는 반복 과정을 직접 처리해야 했다.
즉, for-each문을 통해 각 요소를 반복하면서 처리하였음 -> 외부 반복
스트림 API는 라이브러리 내부에서 모든 데이터가 처리된다 -> 내부 반복
또한, 컬렉션을 이용했을 때 많은 요소를 가진 목록을 반복한다면 오랜 시간이 걸릴 수 있다.
--> 멀티코어로 가진 코어 수만큼 병렬로 처리하는 것이 좋다.
멀티코어의 활용의 어려움과 컬렉션을 처리하면서 발생하는 코드 문제를 해결
필터링, 추출, 그룹화하는 기능이 존재하고 병렬화도 가능.
두 개의 CPU로 앞 부분 / 뒷 부분을 나눠서 데이터를 처리한다. (포킹 단계)
-> 마지막으로 하나의 CPU가 두 결과를 정리
컬렉션 - 어떻게 데이터를 저장하고 접근할지에 대한 중점
스트림 - 데이터 계산에 중점
스트림은 내부적으로 스트림 내의 요소를 쉽게 병렬로 처리
컬렉션을 필터링 할 수 있는 가장 빠른 방법은 컬렉션 -> 스트림 -> 병렬 처리 -> 리스트로 변환
디폴트 메서드
더 쉽게 변화할 수 있는 인터페이스를 만들 수 있도록 디폴트 메서드를 추가
'개발 성장기 > JAVA' 카테고리의 다른 글
[자바 8인 액션] 4장. 스트림 소개 (0) | 2020.07.05 |
---|---|
[자바 8인 액션] 3장. 람다 표현식 (0) | 2020.07.01 |
[자바 8 인 액션] 2장. 동작 파라미터화 코드 전달 (0) | 2020.06.17 |
[자바의 신] 1 ~ 13장 (0) | 2019.12.08 |
String, StringBuilder, StringBuffer 차이 (0) | 2019.11.14 |