본문 바로가기
Study/모던 자바 인 액션

1장, 자바 8,9,10,11은 무슨일이 벌어지고 있는가?

반응형

java8 추가된 새로운 기능

스트림 처리

  • 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임
  • Java8, 스트림 API 추가, java.util.stream

    => 조립라인처럼 어떤 항목을 연속으로 제공하는 어떤 기능 ( 단순 정의 )
    • 스트림 파이프라인을 이용해서 입력부분을 여러 CPU 코어에 쉽게 할당 가능
    • 스레드라는 복잡한 작업을 사용하지 않으면서도 공짜로 병렬성을 얻을 수 있다.

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

  • 코드 일부를 API로 전달하는 기능
  • 1장 Comparator 객체를 생성해서 넘겨주는 방식은 “너무 복잡하며, 기존 동작을 단순하게 재활용한다는 측면에서도 맞지않다.”

    ==> “동작 파라미터화”를 이용해 간결하게

병렬성과 공유 가변 데이터

  • “병렬성을 꽁자로 얻을 수 있다” 에서 시작
  • 전제: 스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행될 수 있어야 한다.

    => 즉 “공유된 가변 데이터”에 접근하지 않아야 한다. ( final 외부참조만 가능 )
  • 함수형 프로그래밍 <=> 명령형 프로그래밍

자바 함수

  • 자바 8에서는 함수를 새로운 값의 형식으로 추가
  • 배경
    • 프로그램이 실행하는 동안 모든 구조체를 자유롭게 전달 할 수 없다.( 이급시민 )
    • 메서드와 클래스(객체화되기전)은 그자체로 값이 될 수 없다. ( 전달 불가능 )
    • 이를 해결하기 위해 런타임에 메서드를 전달 할 수 있게 ( 이급 -> 일급 ) Java 8에서 기능을 추가
    • 메서드를 값으로 전달할 수 있는 기능이 스트림 같은 다른 자바8 새로운 기능의 토대가 됐다.
  • 새로운 기능
  • 메서드 참조
    • ‘::’ 해당 메서드를 값으로 사용하라
  • 람다
    • 익명 함수
    • 람다를 포함하여 함수도 값으로 취급할 수 있다.
    • 한번만 사용할 메서드를 따로 정의할 필요 없이, 짧고 간결하게 그자리에서 보여준다.
    • 람다가 몇줄이상 길어진다면, 익명 람다보다는 코드가 수행하는 일을 명확하게 보여주는 이름을 가진 메서드를 정의하고 메서드 참조를 하는것이 바람직하다.
    • “이용할 수 있는 편리한 클래스나 메서드가 없을떄 새로운 람다 문법을 이용하면 더 간결하게 코드를 구현할 수 있다.”
  • Predicate 함수
    • 수학에서 인수로 값을 받아 true, false를 반환하는 함수를 프레디케이트라고 한다.
    • boolean을 반환하기에 Boolean으로 되는 오토박싱이 안되서 효율적이다.

스트림

  • 기존의 스트림을 적용하지 않은 코드는 “중첩된 제어 흐름 문장”이 많아서 코드를 한 번에 이해하기도 어렵다.
  • 외부 반복: for-each 루프를 이용해서 각 요소를 반복하며 작업을 수행하는 것
  • 내부 반복: 스트림 API를 이용하여 라이브러리 내부에서 모든 데이터를 처리하는 것
  • 컬렉션을 이용한 루프는 다른 문제를 발생시킬 수 도있다.
    • 거대한 리스트를 단일 CPU로 처리하기가 힘들 수 있다.

      => 멀티코어를 이용, 병렬로 처리해야 빠르다.

멀티쓰레딩

  • java8에서는 synchronized가 필요치 않은 함수영 프로그래밍 형식의 스트림 기반 병렬성을 이용하도록 권고
  • 스트림을 이용함으로 아래 두가지문제를 해결
    1. 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제
      • 컬렉션은 어떻게 데이터를 저장하고 접근할지에 중점
    2. 멀티코어 활용 어려움
  • 스트림은 데이터에 어떤 계산을 할 것인지, 묘사하는 것에 중점
  • 스트림의 포킹 단계
    • 두 CPU가 한 컬렉션을 나눠서 계산후 다시 결과를 정리하는 것
  • java8 스트림처리
    • 큰 스트림은 병렬로 처리할 수 있도록 작은 스트림으로 분할한다.
    • filter같은 라이브러리 메서드로 전달된 메서가 상호작용을 하지 않는다면 가변 공유 객체를 통해 공짜로 병렬성을 누릴 수 있다.
728x90
반응형

'Study > 모던 자바 인 액션' 카테고리의 다른 글

3장, 람다란 무엇인가?  (0) 2021.08.07
2장, 동작 파라미터화 코드 전달하기  (0) 2021.08.07