Java에서 가장 큰 변화를 가지고 오고, 현재까지 가장 많이 사용하는 버전은 버전 8이다. 이 책의 1장에서는 Java 8이 나오게 된 배경과 추가된 기능을 설명하고 있다.
Java 8이 등장하게 된 배경부터 알아보자.
- 현재 많은 컴퓨터들이 CPU의 발전으로 인해 멀티코어, 다중코어를 탑재하고 있다.
- 이전까지의 Java 프로그램들은 코어 중 하나만을 사용했다.
- 이전까지 나머지 코어를 활용하려면 Thread를 사용하는것이 좋다는 의견이 대부분이였다.
- Thread의 사용은 관리가 어렵고 많은 문제가 발생할 수 있었다.
- 빅데이터의 활용 증가로 인해 병렬 프로세싱 활용 요구가 커졌지만 Java 8 이전에는 대응하지 못하였다.
- 따라서 Java는 병렬 실행 환경을 쉽게하고 에러가 덜 발생하는 방향으로 진화
JAVA 8 : 병렬 실행 제공(Stream API 통해), 간결한 코드(메서드 참조 & 람다, Default Method)
1. Stream 처리
Stream : 한번에 한개씩 만들어지는 연속적인 데이터 항목의 모임
- 기존에는 한번에 한 항목을 처리했지만 Java 8에서 등장한 Stream API 덕분에 Thread라는 복잡한 작업을 사용하지 않으면서 공짜 병렬성을 얻을 수 있다.
- 작업을 고수준으로 추상화하여 일련의 스트림으로 만들어 처리
(일단은 Stream API가 어떤 항목을 연속으로 제공하는 기능이라고 단순하게 생각하자..)2. 동작 파라미터화로 메서드에 코드 전달
코드의 일부를 API로 전달하는 기능
- 이전까지는 메서드를 다른 메서드로 전달이 불가했다.
이렇게 전달이 불가한 것을 이급 시민(클래스, 메서드)라 하고 전달 가능한 것을 일급 시민(변수 등)이라 한다.3. 병렬성과 공유 가변 데이터
- Stream method로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행 되어야 함
- 안전하다 : 공유된 가변 데이터에 접근하지 않는 것
만약 두 병렬 프로그램이 하나의 공유된 변수에 접근하여 수정 시 심각한 문제 발생 가능- 순수 함수(상태없는 함수) : 공유된 가변 데이터에 접근하지 않는 함수
- 물론 synchronized를 이용해 공유된 가변 데이터를 보호할 수 있지만, Java 8 스트림을 이용하면 기존 Thread보다 쉽게 병렬성 활용 가능
위에서 설명한 기존 이급 시민이였던 메서드, 람다가 일급 시민으로 바뀌는 기능이 추가되었다.
1. 메서드 참조(::)
- ::는 이 메서드를 값으로 사용하라는 의미
- 메서드 참조를 통해 이급 시민이였던 메서드를 일급 시민처럼 값을 넘겨 줄 수 있게 되었다
2. 람다 : 익명 함수
- 람다를 포함하여 함수도 값으로 취급 가능
- 이용할 수 없는 편리한 클래스나 메서드가 없을 때, 람다를 이용하여 간결하게 코드 구현 가능
3. Stream
- Stream API를 이용할 시 Collection API와 상당히 다른 방식으로 데이터 처리 가능
- 컬렉션에서는 반복 과정을 직접 처리 : for-each 루프를 이용해 각 요소를 반복하면서 작업을 수행하는 것을 외부 반복이라 한다
- Stream API에서는 루프를 신경 쓸 필요가 없이 라이브러리 내부에서 모든 데이터가 처리되는데, 이를 내부 반복이라 한다.
- 컬렉션을 처리하며 발생하는 코드 문제, 멀티 코어 활용 어려움이 해결되었다.
예시로 리스트를 필터링할 때, 한 CPU는 리스트의 앞 부분을 처리하고, 다른 CPU는 리스트의 뒷부분을 처리하도록 요청할 수 있다. 이를 포킹 단계라고 한다.4. Default Method
- 인터페이스를 바꿔야 하는 상황에서, 이전까지는 인터페이스를 구현하는 모든 클래스의 구현을 변경
- Java 8에서는 인터페이스를 쉽게 바꿀 수 있도록 Default Method를 지원
5. Optional 클래스 지원
- NullPointer 예외를 피할 수 있도록 도와줌
- 값이 없는 상황을 어떻게 처리할지 명시적으로 구현하는 메서드 포함
Optimal은 이전 블로그 글에서 따로 작성하였다.
이외에도 추가된 여러가지 기능이 있지만 현재 이해할 수 있는 내용, 책에서 강조한 내용은 여기까지이다. 아직 책의 첫 챕터라 이해가 되는 부분도 있고 이해가 되지 않는 부분도 있는데 이는 추후 책을 읽으며 이해하고 수정 할 계획이다.