JAVA 공부일기2-1
모던 자바 인 액션
Chapter1 자바8,9,10,11: 무슨 일이 일어나고 있는가?
1.1 역사의 흐름은 무엇인가?
자바 역사를 통틀어 가장 큰 변화가 자바 8에서 일어남→ 간결한 코드, 멀티코어 프로레서의 쉬운 활용.
- 스트림 API
- 메서드에 코드를 전달하는 기법
- 인터페이스의 디폴트 메서드
1.2 왜 아직도 자바는 변화하는가?
프로그래밍 언어는 마치 생태계와 닮아있어 새로운 언어가 등장하면서 진화되지 않은 기존 언어는 도태되고 사라짐.
자바는 처음부터 많은 유용한 라이브러리를 포함한 잘 설계된 객체지향 언어로 시작함. (+JVM의 업데이트로 경쟁언어와 자바가 상호동작함. 또한 다양한 임베디드 컴퓨팅 분야에도 널리 사용됨.)
프로그래밍 언어 생태계에 변화의 바람이 불기 시작. 빅데이터를 효과적으로 처리할 필요성↑. 자바8은 변화에 적응하기 위해 변화함.
스트림 처리
스트림이란? 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임.
자바8에는 java.util.stream 패키지에 스트림API(조립 라인처럼 어떤 항목을 연속으로 제공하는 기능) 추가.
기존에는 한 번에 한 항목을 처리했지만 자바8에서는 추상화해서 일련의 스트림으로 만들어 처리.
동작 파라미터화로 메서드에 코드 전달하기
자바8에서는 메서드를 다른 메서드의 인수로 넘겨주는 기능 제공. 스트림API는 연산의 동작을 파라미터화할 수 있는 코드를 전달한다는 사상에 기초.
병렬성과 공유 가변 데이터
기존의 synchronized는 시스템 성능에 악영향을 미침. 자바8 스트림을 이용하면 기존의 자바 스레드 API보다 쉽게 병렬성 활용 가능. 공유 가변 데이터 요구사항은 인수를 결과로 반환하는 기능과 관련.(이 요구사항은 수학적인 함수처럼 정해진 기능만 수행하며 다른 부작용은 일으키지 않음을 의미.)
1.3 자바 함수
자바8에서는 함수를 새로운 값의 형식으로 추가. 프로그래밍의 핵심은 값을 바꾸는 것. 자바에서 값은 역사적으로 일급시민이라 부르며, 전달할 수 없는 구조체는 이급시민이라 칭함.
메서드와 람다를 일급 시민으로
메서드 참조: '::'(이 메서드를 값으로 사용하라는 의미). 기존에 객체 참조(new로 객체 참조 생성)를 이용해서 객체를 이리저리 주고받았던 것처럼, 자바8에서는 메서드 참조를 만들어 전달.
filterApples(inventory, Apple::isGreenApple);
람다(익명 함수): 한번만 사용할 메서드는 따로 정의할 필요x. (int x) -> x + 1, x라는 인수를 호출하면 x+1 반환.
filterApples(inventory, (Apple a) -> GREEN.equals(a.getColor()) );
1.4 스트림
스트림API를 이용하면 루프를 신경 쓸 필요x. 내부 반복으로 내부에서 데이터 처리.
스트림 API(java.util.stream)로 '컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제' , '멀티코어 활용 어려움'이라는 두 가지 문제 모두 해결.
가변 공유 상태가 없는 병렬 실행을 이용해서 효율적이고 안전하게 함수나 메서드 호출.
1.5 디폴트 메서드와 자바 모듈
기존 자바 기능으로는 대규모 컴포넌트 기반 프로그래밍 그리고 진화하는 시스템의 인터페이스 적절하게 대응하기 어려움. 자바9에서는 모듈을 이용해 시스템의 구조를 만들 수 있음.
자바8에서는 디폴트 메소드를 이용해 기존 인터페이스를 구현하는 클래스를 바꾸지 않고도 인터페이스 변경할 수 있음.
1.6 함수현 프로그래밍에서 가져온 다른 유용한 아이디어
Optional<T>: NullPoniter 예외를 피할 수 있도록 도와주는 클래스. 값을 갖거나 갖지 않을 수 있는 컨테이너 객체.
패턴 매칭 기법: if-then-else, switch보다 패턴 매칭으로 더 정확한 비교 구현 가능.