모던 자바 인 액션
자바 8에서 달라진 것들
=> 함수형 프로그래밍의 지향 (람다와 스트림)
"자바 8은 데이터베이스 질의 언어에서 표현식을 처리하는 것처럼 병렬 연산을 지원하는 스트림이라는 새로운 API를 제공한다. 데이터베이스 질의 언어에서 고수준 언어로 원하는 동작을 표현하면, 구현에서 최적의 저수준 실행 방법을 선택하는 방식으로 동작한다. 즉, 스트림을 이용하면 에러를 자주 일으키며 멀티코어 CPU를 이용하는 것보다 비용이 훨씬 비싼 키워드 synchronized를 사용하지 않아도 된다."
- 39p
달라진 것들
1. 스트림 처리
2. 동작 파라미터화로 메서드에 코드 전달하기
3. 병렬성과 공유 가변 데이터
- 44~ 46p
기존 값을 변화시키는 데 집중했던 고전적인 객체지향에서 벗어나 함수형 프로그래밍으로 다가섰다는 것이 자바 8의 가장 큰 변화다.
- 47p
프로그래밍 언어의 핵심은 값을 바꾸는 것이다. 역사적으로 그리고 전통적으로 프로그래밍 언어에서는 이 값을 일급(first-class 퍼스트클래스 값)이라고 부른다.
- 49p
=> 메서드, 클래스 등은 이급 자바 시민
=> 메서드 참조라는 새로운 자바 8의 기능 (:: '이 메서드를 값으로 사용하라')
- 48~ 50p
자바 8에서는 더 이상 메서드가 이급값이 아닌 일급값이라는 것이다. 기존에 객체 참조(new로 객체 참조를 생성함)를 이용해서 객체를 이리저리 주고받았던 것처럼 자바 8에서는 File::isHidden을 이용해서 메서드 참조를 만들어 전달할 수 있게 되었다.
- 50p
람다 (또는 익명 함수)를 포함하여 함수도 값으로 취급할 수 있다. 예를 들어 (int x) -> x + 1, 즉 'x 라는 인자를 호출하면 x + 1을 반환'하는 동작을 수행하도록 코드를 구현할 수 있다. ... 람다 문법 형식으로 구현된 프로그램을 함수형 프로그래밍, 즉 '함수를 일급값으로 넘겨주는 프로그램을 구현한다'라고 한다.
- 51p
public static boolean isGreenApple (Apple apple){
return GREEN.equals(apple.getColor());
}
public static boolean isHeavyApple(Apple apple) {
return apple.getWeight() > 150;
}
public interface Predicate<T>{
boolean test(T t);
} // 명확히 하기 위해 추가함
static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (p.test(apple)) { // 사과는 p가 제시하는 조건에 맞는가?
result.add(apple);
}
}
return result;
}
다음처럼 메서드를 호출할 수 있다.
filterApples(inventory, Apple::isGreenApple);
또는
filterApples(inventory, Apple::isHeavyApple);
- 52 ~ 53p
프레디케이트(predicate)란 무엇인가?
앞에서 다룬 예제에서는 Apple::isGreenApple 메서드를 filterApples로 넘겨주었다. 수학에서는 인수로 값을 받아 true나 false를 반환하는 함수를 프레디케이트라고 한다.
- 53p
메서드 전달에서 람다로
filterApples(inventory, (Apple a) -> Green.equals(a.getColor()) );
즉, 한 번만 사용할 메서드는 따로 정의를 구현할 필요가 없다.
- 54p
자바 8은 스트림 API로 '컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제' 그리고 멀티코어 활용 어려움'이라는 두 가지 문제를 모두 해결했다.
- 57p
전통적으로 멀티스레딩 환경에서는 synchronized를 자주 활용한다. 하지만 synchronized를 활용하더라도 많은 미묘한 버그가 발생할 수 있다. 자바 8에서는 synchronized가 필요치 않은 함수형 프로그래밍 형식의 스트림 기반 병렬성을 이용하도록 권고한다. 자바 8에서는 데이터 접근 방법을 제어하는 것이 아니라 어떻게 데이터를 분할할지 고민하게 된다.
- 57p
컬렉션을 필터링할 수 있는 가장 빠른 방법은 컬렉션을 스트림으로 바꾸고, 병렬로 처리한 다음에, 리스트로 다시 복원하는 것이다.
- 59p
인터페이스의 defualt 메서드의 장점
=> 기존의 코드를 건드리지 않고도 원래의 인터페이스 설계를 자유롭게 확장할 수 있음
- 61p
'Book' 카테고리의 다른 글
[독서 기록] 모던 자바 인 액션 3장 람다 표현식 (1) | 2023.01.06 |
---|---|
[독서 기록] 모던 자바 인 액션 2장 - 동작 파라미터화 코드 전달하기 (0) | 2023.01.04 |
[독서 기록] 객체지향의 사실과 오해 (1) | 2022.12.08 |
[독서 기록] 개발자의 글쓰기, 저자 김철수, 출판 위키북스, 2019 (1) | 2022.11.26 |
[독서 기록] 나는 주니어 개발자다 (0) | 2022.11.22 |