본문 바로가기
Book

[독서 기록] 모던 자바 인 액션 1장 자바 8, 9, 10, 11 : 무슨 일이 일어나고 있는가?

by Renechoi 2023. 1. 4.
 
모던 자바 인 액션
자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 모두 그대로 쓸 수 있으며, 새로운 기능과 문법, 디자인 패턴으로 더 명확하고 간결한 코드를 구현할 수도 있다. 이 책은 함수형 언어의 영감을 받아 자바 8, 9, 10에 추가된 람다, 스트림, 함수형 프로그래밍, 자바 모듈 시스템, 병렬화와 공유 가변 데이터, 동작 파라미터화 등의 주요 기능을 자바 개발자에게 알려준다. 수정처럼 투명한 예제와 꼼꼼한 정보 제공으로 여러분의 노력에 보답할 것이다. 이 책은 『자바 8 인 액션』의 개정판으로서 1, 8, 10, 4, 17, 21장은 신규 추가되거나, 그에 준하는 큰 수정이 있었다. 부록을 뺀 나머지 모든 장도 수정 보강되었다.
저자
라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트
출판
한빛미디어
출판일
2019.08.01

모던 자바 인 액션 

 


 

자바 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 

 

 

반응형