본문 바로가기

책/모던 자바 인 액션

(14)
18장 함수형 관점으로 생각하기 18.1 시스템 구현과 유지보수함수형 프로그래밍이 제공하는 주가용 없음과 불변성이라는 개념이 이 문제를 해결하는 데 도움을 준다.이처럼 공유 가변 데이터 구조를 사용하면 프로그램 전체에서 데이터 갱신 사실을 추적하기가 어려워진다.자신을 포함하는 클래스의 상태 그리고 다른 객체의 상태를 바꾸지 않으며 return 문을 통해서만 자신의 겨로가를 반환하는 메서드를 순수 메서드 또는 부작용 없는 메서드라고 부른다.함수형 프로그래밍은 선언형 프로그래밍을 따른느 대표적인 방식이며, 이전에 설명한 것처럼 부작용이 없는 계산을 지향한다.18.2 함수형 프로그래밍이란 무엇인가?실제 부작용이 있지만 아무도 이를 보지 못하게 함으로써 함수형을 달성할 수 있다.함수나 메서드는 지역 변수만을 변경해야 함수형이라 할 수 있다.
16장 CompletableFuture: 안정적 비동기 프로그래밍 16.1 Future의 단순 활용자바 5부터는 미래의 어느 시점에 결과를 얻는 모델에 활용할 수 있도록 Future 인터페이스를 제공하고 있다.결과가 준비되었다면 즉시 결과를 반환하지만 결과가 준비되지 않았다면 작업이 완료될때 까지 우리 스레드를 블록시킨다.get 메서드를 오버로드해서 우리 스레드가 대기할 최대 타임아웃 시간을 설정하는 것이 좋다.비동기 API에서는 메서드가 즉시 반환되며 끝내지 못한 나머지 작업을 호출자 스레드와 동기적으로 실행될 수 있도록 다른 스레드 에 할당한다.16.2 비동기 APU 구현Future는 결과값의 핸들일 뿐이며 계산이 완료되면 get 메서드로 결과를 얻을 수 있다.가격 정보가 있으면 Future에서 가격 정보를 읽고, 가격정보가 없으면 가격 정보를 받을때까지 블록한다...
15장 CompletableFuture와 리액티브 프로그래밍 컨셉의 기초 동시성은 단일 코어 머신에서 발생할 수 있는 프로그래밍 속성으로 실행이 서로 겹칠 수 있느 ㄴ반면 병렬성은 병렬 실행을 하드웨어 수준에서 지원한다.15.1 동시성을 구현하는 자바 지원의 진화매쉬업 어플리케이션 즉, 다양한 웹 서비스를 이용하고 이들 정보를 실시간으로 조합해 사용자에게 제공하거ㅏ 추가 웹 서비스를 통해 제공하는 종류의 애플리케이션 -> 리액티브 프로그래밍다시 말해 스트림을 이용해 스레드 사용패턴을 추상화할 수 있다.주어진 프로그램에서 사용할 최적의 자바 스레드 개수는 사용할 수 있는 하드웨어 코어의 개수에 따라 달라진다.프로그래머는 태스크(Runnable이나 Callable)를 제공하면 스레드가 이를 실행한다.핵심은 블록할 수 있는 태스크는 스레드 풀에 제출하지 말아야 한다는 것이지만 항상..
13장 디폴트 메서드 ❗ 본 포스팅은 타이핑 공부법으로 작성하였습니다. 그렇기에 부족한 점이 존재할 수 있습니다.디폴트 메서드가 없던 시절에는 인터페이스에 메서드를 추가하면서 여러 문제가 발생했다.13.1 변화하는 API모든 클래스는 추가한 메서드를 구현해야 한다.디폴트 메서드로 이 모든 문제를 해결할 수 있다. 디폴트 메서드들 이용해서 API를 바꾸면 새롭게 바뀐 인터페이스에서 자동으로 기본 구현을 제공하므로 기존 코드를 고치지 않아도 된다.13.2 디폴트 메서드란 무엇인가?자바 8에서는 호환성을 유지하면서 API를 바꿀수 있도록 새로운 기능인 디폴트 메소드를 제공한다.13.3 디폴트 메서드 활용 패턴디폴트 메서드를 이용하면 기존에는 불가능했던 동작 다중 상속 기능도 구현할 수 있다.필요한 기능만 포함하도록 인터페이스를 최..
12장 새로운 날짜와 시간 API ❗ 본 포스팅은 타이핑 공부법으로 작성하였습니다. 그렇기에 부족한 점이 존재할 수 있습니다.12.2 날짜 조정, 파싱, 포매팅TemporalAdjusters를 사용하면 각 달의 첫번째 요일, 마지막 요일 내년의 첫번째 요일을 반환하는 등의 작업을 할 수 있다.함수형 인터페이스를 구현해 커스텀 TemporalAdjuster를 만들수 있다(평일만을 계산해주는 로직등..)날짜와 시간을 출력하는 포맷을 임의로 설정할 수 있다.(by DateTimeFormatter)
11장 null 대신 Optional 클래스 ❗ 본 포스팅은 타이핑 공부법으로 작성하였습니다. 그렇기에 부족한 점이 존재할 수 있습니다.11.1 값이 없는 상황을 어떻게 처리할까?대부분의 프로그래머는 필요한 곳에 다양한 null 확인 코드를 추가해서 null 예외 문제를 해결하려 할 것이다.if가 추가되면서 코드 들여쓰기 수준이 증가한다.반복 패턴 코드를 '깊은 의심'이라고 부른다.null 때문에 발생하는 문제에러의 근원이다.코드를 어지럽힌다.아무 의미가 없다.자바 철학에 위배된다.형식 시스템에 구멍을 만든다.11.2 Optional 클래스 소개Optional은 선택형 값을 캡슐화하는 클래스다.모든 null 참조를 Optional로 대치하는 것은 바람직하지 않다.11.3 Optional 적용 패턴자바 9에서는 Optional을 포함하는 스트림을 쉽..
10장 람다를 이용한 도메인 전용 언어 ❗ 본 포스팅은 타이핑 공부법으로 작성하였습니다. 그렇기에 부족한 점이 존재할 수 있습니다.DSL은 작은, 범용이 아니라 특정 도메인을 대상으로 만들어진 특수 프로그래밍어언다.스트림의 API의 특성인 메서드 체인을 보통 자바의 루프의 복잡합 제어와 비교해 유창함을 의미하는 플러언트 스타일이라고 부른다.10.1 도메인 전용 언어DSL은 특정 비즈니스 도메인의 문제를 해결하려고 만든 언어다.다중 DSL이미 해당 기술을 가지고 있어야 한다.자바와 호환성이 완벽하지 않을 때가 많다.10.3 자바로 DSL을 만드는 패턴의 기법메서드 체인을 이용하면 한 개의 메서드 호출 체인으로 거래 주문을 정의할 수 있다.플루언트 API로 도메인 객체를 만드는 몇개의 빌더를 구현해야 한다.빌더를 구현해야 한다는 것이 메서드 체인..
9장 리팩터링, 테스팅, 디버깅 ❗ 본 포스팅은 타이핑 공부법으로 작성하였습니다. 그렇기에 부족한 점이 존재할 수 있습니다. 익명 클래스를 사용할 경우 알고리즘(로직)의 주요 부분만 조각화해서 메서드에 인자로 건네줄 수 있다.람다 표현식을 사용할때 메서드 참조로 해결할 수 있다.명령형 데이터 처리로 작성된 반복문을 스트림으로 해결할 수 있다.그렇다하더라도 과도한 람다 사용은 가독성을 낮추는 원인이 될 수 있으므로 적절히 조절하여 사용한다.전략, 템플릿 메서드, 옵저버, 의무체인 모두 람다를 이용해 간결하게 나타낼 수 있다.
8장 컬렉션 API 개선 ❗ 본 포스팅은 타이핑 공부법으로 작성하였습니다. 그렇기에 부족한 점이 존재할 수 있습니다.8.1 컬렉션 팩토리자바8에서는 List, Set, Map의 컬렉션 팩토리 메소드를 제공한다. (ex. (collection.of))팩토리 메서드의 인자는 가변인자가 아니며 개수를 늘리거나 하지 못한다.8.2 리스트와 집합 처리List에서 인자로 Predicate를 받고 만약 해당 Predicate가 true일 경우 해당하는 원소를 삭제하는 메소드가 존재한다.(removeIf)List에서 인자를 다른 값으로 교체하는 메소드가 존재한다. 다만 특정 요소에 대해서만 교체할 수는 없다.(replaceAll)8.3 맵 처리forEach 메소드를 통해 키와 값 모두 한번에 받아 처리할 수 있다.sort를 통해 정렬할 수 있..
7장 병렬 데이터 처리와 성능 ❗ 본 포스팅은 타이핑 공부법으로 작성하였습니다. 그렇기에 부족한 점이 존재할 수 있습니다.7.1 병렬 스트림순차 스트림을 병렬 스트림으로 바꿀수 있다.그러나 모든 경우에서 병렬 스트림으로 변경하는 것이 만사가 아니며 오히려 속도가 더 느려질 수 있다.병렬 스트림으로 변경시에는 병렬로 작업하기 올바른 알고리즘인지 박싱/언박싱 고려, 다수의 데이터를 고려해야 한다.7.2 포크/조인 프레임워크스트림의 병렬 연산은 분할정복처럼 동작한다.