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

 

1.1 역사의 흐름은 무엇인가?

 

Java 1 : 1997년

Java 5 : 2004년

Java 8 : 2014년

Java release and roadmap

 

자바 버전별 functionality

version feature
1, 2 Thread, lock, GC
5 Thread pool, noi, concurrency, annotation, generic, varargs
7 Diamond op, try resource, Fork/join
8 Default method, method reference,  lambda expression, stream api, completable future, new date api

 

Java 8 가장 큰 특징

스트림 api : 고수준 언어로 질의를 하면 구현은 최적읜 내부 실행

동작(로직)을 코드에 전달 : 메소드 참조와 람다 : 함수형 프로그래밍 개념 차입

인터페이스의 디폴트 메서드

 

1.2 왜 아직도 자바는 변화하는가?

 

Java가 대중적인 이유 :

다양한 library, 변화에 계속 적응하는 언어, 

 

현대 언어가 구추하고자하는 목표 

병렬성 지원

낮은 boiler plate code

http://www.yes24.com/Product/Goods/12204890

 

자바 8의 변화의 주요 부분

스트림 API : 스트림 처리 = 연속적인 흐름 = 파이프라인 기법

동작 파라메터화 : behavior parameterization : 작동 방식 혹은 로직을 파라메터 입력으로 넣고자 하는 것

병렬성 : 과거 병렬처리 = 프로그램의 동작방식을 변경해야함 : 현재 : parellel=1 > parallel=4 : 결과는 동일함을 보장 = 안전하게 실행

이를 위해서는 공유된 가변 데이터에 접근하는 것이 없어야함 = 순수, 부작용 없는, 상태 없는 ( pure, sife-effect-free, stateless)

과거 : 기존 값을 가공하는데 집중 : 값의 일관성 유지, 객체의 값은 변수 로직이 메소드

현재 : 함수형 프로그래밍, 원하는 결과값만 표현, 수행은 내부의 문제

 


1.3 자바 함수

 

함수 : f(x) = y 함수 = 값 : 자바 언어의 변화 : 메소드가 일급시민화 = 메소드를 값처럼 사용할 수 있다. 메소드를 인자로 넘길수 있다. 

기존자바로는 메소드를 값으로 인식하게 하여 인자에 넘길수가 없었음 : 이급시민

메서드를 인자로 넘기는 문법 : 메소드 레퍼런드 Class::method ex File::isHidden

람다문법 : 함수를 일급값으로 넘여주는 방법

기존에 있던 메소드 : 기명함수 (named) 익명함수 : 람다 (x -> x +1) = (addOne(x))

 

int addOne( x) {

return x + 1

}

Apple::isGreenApple

(Apple a) -> "green".equals(a.getColor())


1.4 스트림

List<Worker> workerList = getWorkerListFromApi();
Map<JobType, List<String>> workerMapByJobTypeAndSalaryByOver100 = new HashMap<>();
for (Worker worker : workerList) {
  if (worker.getSalary() > 100) {
      JobType jobtype = worker.getJobType();
      List<Worker> existWorkerListByJobType = workerMapByJobTypeAndSalayByOver100.get(jobtype);
      if (existWorkerListByJobType == null) {
          existWorkerListByJobType  = new ArrayList<>();
          wokerMapByJobTypeAndSalaryByOver100.put(jobType, existWorkerListByJobType)
      }
      existWokerListByJobType.add(worker);
   }
}
List<Worker> workerList = getWorkerListFromApi();
Map<JobType, List<String>> workerMapByJobTypeAndSalaryByOver100 =
workerList
.stream()
.filter( t -> t.getSalary() > 100)
.collect(groupBy(Worker::getJobType));

stream : list > stream으로 변환

포크 > 파이프라인 > 필터 > 파이프라인 > 조인 : 병렬

Divide and conquer : 분할 정복

전제조건 : 가변 공유가 없는 : 같은 것을 참조하는 게 없는 : 수정을 할수 없는 : immutable


1.5 디폴트 메서드와 자바 모듈

인터페이스 변경을 쉽게 : 인터페이스 변경이 어려운 이유 : 추가는 쉽다. 변경과 삭제가 어렵다. 추가는 정말 쉽나?

상위 인터페이스 추가하면, 하위 구현체에서 모든 abstract method를 구현해야한다.

default 메소드 정의 가능 ( 메서드 바디를 인터페이스에 일부로 포함 가능 )

default 메소드 > 인터페이스에 다중 상속 문제

 

1.6 함수형 프로그래밍에서 가져온 다른 유용한 아이디어

 

Optional

Pattern Matching


1.7 마치며

Java는 계속 성장하고 있다. 잘되는 이유 : 다 잘하는 건 아니지만.. 그래서 많은 사람이 사용하지 않을까.

메소드를 함수로 전달 : 메소드 레퍼런스

Steam API : 컬렉션 처리

인터페이스 디폴트 메서드

Optional 로 null 대체, 패턴 매팅

 

Programming Languaga Ranking in 2021

 

https://statisticstimes.com/tech/top-computer-languages.php

 

Top Computer Languages 2021 - StatisticsTimes.com

 

statisticstimes.com

 

https://dzone.com/articles/a-guide-to-java-versions-and-features

 

Guide to Java Versions and Features - DZone Java

In this guide. we will look at the differences between Java distributions and an overview of Java language features, including Java versions 8-13.

dzone.com

 

+ Recent posts