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
'독서관련 > Modern Java In Action' 카테고리의 다른 글
CHAPTER 3 : 람다 표현식 (0) | 2022.06.14 |
---|---|
CHAPTER 2 : 동작 파라미터화 코드 전달하기 (0) | 2022.06.03 |
java8 CH16 – CompletableFuture (0) | 2020.10.14 |
CH11 Optional, CH12 java time date (0) | 2020.10.13 |
CH07 병렬데이터 처리와 성능, CH08 collection api 개선 (0) | 2020.10.13 |