썸네일 17.3 리액티브 라이브러리 RxJava 사용하기 RxJava는 Flow.Publisher를 구현하는 두 클래스를 제공 io.reactive.Flowable: 역압력 기능을 제공 io.reactivex.Observable: 역압력 기능을 제공하지 않는 기존 클래스 단순한 프로그램, 마우스 움직임 같은 사용자 인터페이스에 적합 이벤트 스트림에는 역압력을 적용하기 어렵기 때문 (마우스 움직임을 느리게 하거나 멈출 수 없음) RxJava는 천 개 이하의 요소를 가진 스트림이나, 마우스 & 터치 이벤트 등 역압력을 적용하기 힘든 GUI 이벤트, 자주 발생하지 않는 종류의 이벤트에 역압력을 적용하지 말 것을 권장함 여기서는 Obsevable 인터페이스를 사용하는 방법을 설명함 모든 subscriber는 request(Long.MAX_VALUE) 메서드를 이용해서..
썸네일 ch17.2.3 Flow 라이브러리 예제 Main.java package org.example; import java.util.concurrent.Flow.*; public class Main { public static void main(String[] args) { getCelsiusTemperatures("New York").subscribe(new TempSubscriber()); } private static Publisher getCelsiusTemperatures(String town){ return subscriber -> { TempProcessor processor = new TempProcessor(); processor.subscribe(subscriber); processor.onSubscribe(new TempSubsc..
썸네일 ch17. 리액티브 프로그래밍 리액티브 프로그래밍의 중요성 빅데이터: 기가 바이트의 데이터 → 페타 바이트 단위의 데이터 다양한 환경: 모바일 디바이스에서 부터 클라우드 기반 클러스터에 이르기까지 다양한 환경에 애플리케이션이 배포됨 사용자 패턴: 사용자는 1년 내내 항상 서비스를 이용할 수 있으며, 밀리초 단위의 응답시간을 기대함 리액티브 프로그래밍: 다양한 시스템과 소스에서 들어오는 데이터 항목 스트림을 비동기적으로 처리하고 합쳐서 해결함 17.1 리액티브 매니패스토 리액티브 애플리케이션과 시스템 개발의 핵심 원칙을 공식적으로 정의함 반응성(responsive): 빠르고 일정하고 예상가능한 반응 시간을 제공함 회복성(resilient): 장애가 발생해도 시스템은 반응해야 함 탄력성(elastic): 애플리케이션에 작업 부하가 심해지..
썸네일 ch16. CompletableFuture: 안정적 비동기 프로그래밍 1. Future의 단순 활용 Future 인터페이스 미래의 어느 시점에 결과를 얻을 수 있음 비동기 계산을 모델링 하는데 사용할 수 있고, 계산이 끝났을 때 결과에 접근할 수 있는 참조를 제공함 시간이 걸리는 작업을 Future 내부로 설정하면 Future에서 계산을 하는 동안 호출한 스레드에서는 다른 작업을 할 수 있음 Future를 사용하기 위해서는 시간이 오래 걸리는 작업을 Callable 객체 내부로 감싼 다음 ExecutorService에 제출해야 함 package org.example; import java.util.concurrent.*; public class ex16_1 { public static void main(String[] args) { ExecutorService es = E..
ch15. CompletableFuture와 리액티브 프로그래밍 컨셉의 기초 15.1 동시성을 구현하는 자바 지원의 진화 15.1.1 스레드와 높은 수준의 추상화 15.1.2 Executor와 스레드 풀 Java5 ExecutorService: task 제출과 실행을 분리할 수 있는 기능 제공 스레드의 문제 Java 스레드는 운영체제 스레드에 직접 접근함. 운영체제 스레드를 만들고 종료하려면 비싼 비용을 치러야 하며 숫자도 제한되어 있음. 주어진 프로그램에서 사용할 최적의 자바 스레드 개수는 사용할 수 있는 하드웨어 코어의 개수에 따라 달라짐 스레드 풀 그리고 스레드 풀이 더 좋은 이유 ExecutorService: task를 제출하고 나중에 결과를 수집할 수 있는 인터페이스를 제공함 장점: hw에 맞는 수의 task를 유지함과 동시에 많은 태스크를 스레드 풀에 오버헤드 없이 제..
썸네일 [ch4] 스트림 소개 1. 스트림이란 무엇인가? 2. 스트림 시작하기 3. 스트림과 컬렉션 4. 스트림 연산 1. 스트림이란 무엇인가? 선언형(질의 표현)으로 컬렉션 데이터를 처리할 수 있음 루프, if문 등의 제어 블록을 사용할 필요 없다! 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있음 filter, sorted, map, collect 등 여러 빌딩 블록연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다. 특정 스레딩 모델에 제한되지 않고, 자유롭게 어떤 상황에서든 사용할 수 있다. 내부적으로 단일 스레드 모델에 사용할 수 있지만 멀티코어 아키텍처를 최대한 투명하게 활용할 수 있도록 구현되어 있음 따라서 병렬화 과정에서 스레드와 락을 걱정할 필요가 없다! public static L..
[ch3] 람다 표현식 (2) 3.5 형식 검사, 형식 추론, 제약 3.5.1 형식 검사 람다가 사용되는 context를 이용해 람다의 형식을 추론할 수 있음 대상 형식: 어떤 context에서 기대되는 람다 표현식의 형식 List heavierThan150g = filter(inventory, (Apple apple)->apple.getWeight() > 150); 형식 확인 과정 filter 메서드의 선언을 확인한다. filter 메서드는 두 번째 파라미터로 Predicate 형식을 기대한다. 여기서 Predicate이 대상 형식이 된다. Predicate은 test라는 한 개의 추상 메서드를 정의하는 함수형 인터페이스이다. test 메서드는 Apple을 받아 boolean을 반환하는 함수 디스크립터를 묘사한다. filter 메서..
[ch3] 람다 표현식 (1) 3.1 람다란 무엇인가? 람다 표현식: 메서드로 전달할 수 있는 익명 함수를 단순화한 것 람다의 특징 익명: 메서드에 이름이 없음 함수: 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트를 가질 수 있음 전달: 메서드 인수로 전달하거나 변수로 저장 가능 간결성: 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요 없음 람다 이용 예시 // 익명 클래스 Comparator byWeight = new Comparator(){ public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getWeight()); } }; // 람다 Comparator byWeight = (Apple a1, Apple a2)-> a1.get..
[ch2] 동작 파라미터화 코드 전달하기 동작 파라미터화 아직 어떻게 실행할 것인지 결정하지 않은 코드 블록 코드 블록은 나중에 프로그램에서 호출함 (ex. 실행될 메서드의 인수로 코드 블록을 전달) 2.1 변화하는 요구사항에 대응하기 예제: 기존의 농장 재고목록 애플리케이션의 리스트에서 녹색 사과만 필터링하는 기능을 추가 첫 번째 시도) 녹색 사과 필터링 enum Color {RED, GREEN} public static List filterGreenApples(List inventory){ List result = new ArrayList(); // 사과 누적 리스트 for (Apple apple:inventory){ if (GREEN.equals(apple.getColor()){ // 녹색 사과만 선택 result.add(apple); }..
ch1. 자바 8, 9, 10, 11 무슨 일이 일어나고 있는가? 1. 역사의 흐름은 무엇인가? Java8의 등장 자연어에 더 가까운 방식의 코드 Collections.sort(inventory, new Comparator(){ public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getWeight()); } }); // Java8 inventory.sort(comparing(Apple::getWeight)); 하드웨어적 변화 멀티코어 CPU의 대중화 대부분의 자바 프로그램은 코어 중 하나만을 사용했음 나머지 코어를 활용하려면 스레드를 이용해야하는데 에러가 발생하기 쉬움 Java8에서는 병렬 실행을 새롭고 단순한 방식으로 접근할 수 있는 방법을 제공함 스트림 API 데이터베이스 질의 언어에..