본문 바로가기

Dev Book Review/Java8 in Action

[자바8인액션] Chap.1 자바 8을 눈여겨 봐야하는 이유

소스코드

https://github.com/mjung1798/Jyami-Java-Lab/tree/master/java8-in-action

 

mjung1798/Jyami-Java-Lab

💻 Jyami의 Spring boot 및 Java 실험소 💻. Contribute to mjung1798/Jyami-Java-Lab development by creating an account on GitHub.

github.com

1. 자바의 변화

a. 자바의 시작

  • 출발자체가 많은 유용한 라이브러리를 포함하는 잘 설계된 객체지향 언어
  • 소소한 동시성도 지원
  • JVM 바이트코드로 컴파일하는 특징 -> 인터넷 애플릿 프로그램 주 언어
  • 캡슐화 덕분에 C에 비해 소프트웨어 엔지니어링적 문제가 훨씬 적다.

b. 언어 생태계의 변화

빅데이터에 직면하면서 멀티코어 컴퓨터, 컴퓨팅 클러스터를 이용하는 움직임이 생김 : 병렬 프로세싱 활용

대용량 데이터와 멀티코어 CPU를 효과적으로 활용해야 했다 => 자바 8의 변화

c. 자바 8의 3가지 프로그래밍 개념

1. 스트림 처리(Stream processing) : 여러행의 스트림을 입력으로 받아 여러 행의 스트림을 출력으로 만든다.

cat file1 file2 | tr "[A-Z]" "[a-z]" | sort | tail -3

Stream<T> : 하려는 작업을 추상화하여 일련의 스트림으로 만들어 처리 가능, 입력 부분을 여러 CPU 코어에 할당 가능

2. 동작 파라미터화(behavior prameterization)로 메서드에 코드 전달

코드의 일부를 API로 전달하는 기능 : 함수형 프로그래밍

3. 병렬성과 공유 가변 데이터

스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행되도 안전하게 실행이 된다.

공유 가변데이터에 접근하지 않기 때문이다 => 순수(pure) 함수, 부작용없는(side-effect-free) 함수, 상태없는(stateless) 함수 : 함수형 프로그래밍

자바 역시 하드웨어나 프로그래머의 기대의 변화에 부응할 수 있도록 변화하였다.

 

2. 자바 함수

자바의 함수 : 부작용을 일으키지 않는 함수

자바8로 인해 이급 시민 => 일급 시민 변화가 일어났다.

  • 일급(first-class) 시민 : 조작이 가능한 것, 바꿀 수 있는 값 : 기본값(int, double), 객체(String, Integer, HashMap 등)
  • 이급 시민 : 전달 할 수 없는 구조체, 바꿀 수 없는 값 : 메서드, 클래스

a. 메서드 레퍼런스(method reference)

이 메서드를 값으로 사용한다 : 메서드가 이급값이 아닌 일급값이 되었다.

객체 레퍼런스(new Object())로 객체를 주고받았던 것 처럼 메서드 레퍼런스를 만들어 전달 할 수 있게되었다.

b. 람다(lambda):익명함수(anonymous function)

함수도 값으로 취급할 수 있다.

직접 메서드를 정의할 수도 있지만, 이용할 수 있는 있는 편리한 클래스나 메서드가 없을 때 새로운 람다 문법을 이용하면 코드를 더 간결하게 구현할 수 있다.

람다 문법 형식으로 구현된 프로그램 == 함수형 프로그래밍 == 함수를 일급값으로 넘겨주는 프로그램을 구현한다.

 

3. 스트림(stream)

컬렉션 스트림
반복과정을 직접 처리한다 (for-each) 라이브러리 내부에서 모든 데이터가 처리된다
외부반복(external iteration) 내부 반복(internal iteration)
  여러 CPU 코어에 작업을 각각 할당해서 처리시간을 줄일 수 있다.
  • 주어진 조건에 따라 데이터를 필터링(filtering)
  • 데이터를 추출(extracting)
  • 데이터 그룹화(gropuing)
  • 동작을 쉽게 병렬화 가능
    포킹(forking) => 포킹된 리스트 처리 => 처리된 결과를 합침

추가 : 함수형 프로그래밍

  • 함수를 일급값으로 사용한다
  • 프로그램이 실행되는 동안 컴포넌트간에 상호작용이 일어나지 않는다(가변이 아니다)

 

4. 디폴트 메서드

기존 인터페이스의 변경에 대한 어려움 해결 : 인터페이스를 업데이트하면 인터페이스 구현클래스도 업데이트 해야했다.

구현 클래스에서 구현하지 않아도 되는 메서드를 인터페이스가 포함 할 수 있는 기능

 

5. 그 외

  • Optional<T> 클래스 : 값을 갖거나 갖지 않을 수 있는 컨테이너 객체
  • 구조적(structural) 패턴 매칭 기법 : 데이터 형식 분류와 분석을 한번에 수행