1장. 자바 8,9,10,11 무슨 일이 일어나고 있는가?

1장. 자바 8,9,10,11 무슨 일이 일어나고 있는가?

자바 8,9,10,11 무슨 일이 일어나고 있는가? #

자바 역사를 통틀어 자바 8에서 가장 큰 변화가 일어났다.

자바 8에서 제공하는 새로운 기술은 다음과 같다.

  • 스트림 API
  • 메서드에 코드를 전달하는 것 (함수형 프로그래밍(?))
  • 인터페이스 Default 메서드

에러를 자주 일으키고 멀티코어 CPU를 이용하는 것보다 훨씬 비용이 비싼 synchrosized 키워드 대신에 Stream API 을 사용할 수 있다.

또, Stream API 덕분에 메서드에 코드를 전달하는 것, 인터페이스의 Default 메서드 가 자연스럽게 탄생하게 되었다. (?)

메서드에 코드를 전달하는 것동작 파라미터화(behavior parameterization) 을 구현할 수 있음을 의미한다. 또한 함수형 프로그래밍(functional-style programming) 에서 위력을 발휘한다.

자바 8에서 함수평 프로그래밍을 도입하면서 객체지향프로그래밍함수형프로그래밍의 장점을 누릴 수 있게 되었다.


자바 8 설계의 밑바탕을 이루는 세가지 프로그래밍 개념 #

스트림 API (Stream processing) #

첫 번째 중요 개념은 Stream 이다. 스트림이란, 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다.

Stream API 란 ?


동작(행위) 파라미터화 (behavior parameterization) #

두 번째 중요 개념은 코드를 파라미터로 전달할 수 있다는 것이다. (기존에는 익명함수를 사용하곤 했다.)

Stream API 의 연산에서 대개 함수형 인터페이스를 파라미터로 받는데, 이것이 바로 코드를 파라미터로 전달하는 개념인 것이다. (이것을 ‘동작 파라미터화’ 라고 말한다.)


병렬성 (공유 가변 데이터) #

세 번째 중요 개념은 병렬성을 쉽게 얻을 수 있다는 것이다. Stream API 의 연산에서 전달되는 코드(함수형 인터페이스)의 동작 방식을 조금 수정한다면, 병렬 처리를 할 수 있다.

* Stream API 의 메서드로 전달되는 코드는 공유 가변 데이터에 대한 고려가 없어야 한다. 이러한 함수(코드)를 순수 함수(pure), 부작용 없는 함수(side-effect-free), 상태가 없는 함수(stateless) 라고 부른다.


자바의 함수 #

일급 시민과 이급 시민 #

프로그래밍의 핵심은 ‘값을 바꾸는 것’이다. 전통적으로 프로그래밍언어에서는 이 값을 일급(first-class) 또는 시민(citizens) 라고 부른다.

자바에서도 다양한 자료구조가 값을 표현하는데 사용되고 있다. 그러나 모든 자료구조(구조체)를 자유롭게 전달할 수 없는데, 이러한 자료구조(구조체)를 이급 시민이라고 한다.

자바 8에서는 이급 시민을 일급 시민으로 바꿀 수 있는 기능을 추가했다. (* js와 같은 다양한 언어에서 이미 이러한 시도들을 해왔었다.)


메서드, 람다 = 일급 시민 #

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

(자바 8의 새로운 기능인)자바 메서드 참조(::)를 이용해서 메서드를 값으로 직접 전달할 수 있다.

람다(또는 익명함수)를 포함하여 함수도 값으로 취급할 수 있다.


프레디케이트(Predicate) 란? #

수학에서는 인수로 값을 받아 true, false 를 반환하는 함수를 ‘프레디케이트’ 라고 한다.

자바 8에서도 Function<Apple, Boolean> 과 같이 코드를 작성할 수 있지만, Predicate<Apple> 과 같이 사용하는 것이 더 표준적인 방식이다. (* boolean 을 Boolean 으로 변환하는 과정이 없어서 더 효율적이기도 하다.)

이와 관련된 내용은 함수형 인터페이스 에 대해 조금 더 알아보자.

메서드를 값으로 전달하는 것은 매우 유용하다. 다만 한 두번 사용할 메서드를 매번 정의하는 것은 비효율적일 수 있다. 이런 상황에서는 람다를 사용한다. (단, 익명 람다를 사용했는데 코드의 길이가 몇 줄 이상으로 길어진다면, 메서드로 분리하는 것이 바람직하다.)


멀티 스레딩은 어렵다. #

컬렉션으로 처리하면서 발생했던 ‘반복적인 코드 사용 문제’와 ‘멀티 코어 활용의 어려움’의 문제를 모두 해결했다.

컬렉션은 데이터를 어떻게 저장하고 접근할지에 중점을 둔다.
스트림은 데이터에 어떤 계산을 할지에 중점을 둔다.


Default 메서드와 자바 모듈 #

Default 메서드는 구현하지 않아도 되는 메서드이다.

자바 8에서는 인터페이스를 쉽게 변경할 수 있도록 default 메서드를 지원한다.

default 메서드는 특정 프로그램을 구현하는 데 도움을 주는 기능이 아니라, (미래에) 프로그램이 쉽게 변화할 수 있는 기능을 제공한다.

이미 공개된 인터페이스의 기존 구현을 고치지 않고. 변경할 수 있도록 해준다.

* 기존에는 인터페이스에 메서드가 추가되면 이를 구현하는 모든 구현체에서 메서드를 추가해야 했다.



https://github.com/BAEKJungHo/modern-java-in-action/blob/master/01장(자바8%2C9%2C10%2C11).md