Java

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

💡
고전적인 객체지향에서 벗어나 함수형 프로그래밍으로 다가선다.
  • 스트림 API
    • 원하는 동작을 표현하면, Java의 Stream 라이브러리가 구현에서 최적의 저수준 실행 방법을 선택하는 방식으로 동작
  • 메서드에 코드를 전달하는 기법
    • 메서드 참조와 람다
  • 인터페이스의 디폴트 메서드

스트림 처리(Stream Processing)

스트림

한번에 한개씩 만들어지는 연속적인 데이터 항목들의 모임

스트림 API

작업을 DB Query처럼 고수준으로 추상화해서 일련의 스트림으로 만들어 처리 가능
  • 스트림 파이프라인을 이용해서 입력 부분을 여러 CPU 코어에 쉽게 할 당할 수 있다는 부가적인 이득도 있음
    • 스레드라는 복잡한 작업을 사용하지 않으면서도 병렬성을 공짜로 얻을 수 있다.

동작 파라미터화(Behavior Parameterization)로 메서드에 코드 전달하기

병렬성과 공유 가변 데이터

스트림 API를 통해 병렬성을 공짜로 얻을 수 있다.
스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행될 수 있어야 한다.
안전하게 실행할 수 있는 코드를 만들려면, 공유된 가변 데이터(Shared Mutable Data)에 접근하지 않아야 한다.
이러한 함수를 순수(Pure)함수, 부작용 없는(Side-Effect-Free) 함수, 상태 없는(Stateless) 함수라 부른다.

함수형 프로그래밍

람다 문법 형식으로 함수를 일급값으로 넘겨주는 프로그램을 구현하는 것
프로그램이 실행되는 동안 컴포넌트 간에 상호 작용이 일어나지 않는다.
함수형 프로그래밍에서는 우리가 하려는 작업이 최우선시되며, 그 작업을 어떻게 수행하는지는 별개의 문제로 취급한다.

자바 함수

함수(Function)이라는 용어는 메서드(Method), 특히 정적 메서드(Static Method)와 같은 의미로 사용된다.
자바의 함수는 이에 더해 수학적인 함수처럼 사용되며, 부작용을 일으키지 않는 함수를 의미한다.
  • 자바 8에서는 함수를 새로운 값의 형식으로 추가했다.
  • 멀티코어에서 병렬 프로그래밍을 활용할 수 있는 스트림과 연계될 수 있도록 함수를 만들었기 때문이다.

일급값(First-Class)

프로그램을 실행하는 동안 이러한 모든 구조체를 자유롭게 전달할 수 있는 구조체(메서드, 클래스 등)

메서드와 람다를 일급 시민으로

메서드를 일급값으로 사용하면 프로그래머가 활용할 수 있는 도구가 다양해지면서 프로그래밍이 수월해짐

메서드 참조(Method Reference)

Class::Method
이 메서드를 값으로 사용하라는 의미

Lambda : 익명 함수(Anonymous Functions)

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

프레디케이트(Predicate)

수학에서 인수로 값을 받아 true나 false를 반환하는 함수

스트림

병렬성이라는 중요한 특성 때문에 스트림API(Collection과 비슷하며 함수형 프로그래머에게 더 익숙한 API)를 제공
  • 과거에는 for-each 루프를 이용해서 각 요소를 반복하여 작업을 수행하는 외부 반복(External Iteration)을 함
  • 스트림 API를 이용하면 라이브러리 내부 반복(Internal Iteration)으로 모든 데이터가 처리됨
    • 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제 해결
  • 또한 멀티 코어를 활용하여 병렬 처리 가능
    • 멀티 코어 활용 어려움 해결
  • 라이브러리에서 분할을 처리
    • 작은 스트림으로 분할

포킹 단계(Forking Step)

여러 개의 CPU를 가진 환경에서, 리스트를 나누어 처리하고, 마지막으로 하나의 CPU가 결과를 정리하는 것

디폴트 메서드(Default Method)

구현 클래스에서 구현하지 않아도 되는 메서드를 인터페이스에 추가한 것
  • 기존 구현을 고치지 않고 이미 공개된 인터페이스를 변경하기 위함
    • 기존의 코드를 건드리지 않고도 원래의 인터페이스 설계를 자유롭게 확장할 수 있다.

NullPointer 예외를 피할 수 있도록 도와주는 Optional<T>

값을 갖거나 갖지 않을 수 있는 컨테이너 객체
  • 값이 없는 상황을 어떻게 처리할지 명시적으로 구현하는 메서드를 포함

출처