스트림

스트림 병렬화는 주의해서 적용하라 - [7장. 람다와 스트림(아이템48)]
📙 1. 자바의 동시성 프로그래밍 자바는 동시성 프로그래밍 측면에서 항상 앞서갔다. 처음 릴리스된 1996년 스레드, 동기화, wait/notify 지원 자바 5 동시성 컬렉션인 java.util.concurrent 라이브러리와 실행자(Executor) 프레임워크 지원 자바 7 고성능 병렬 분해(parallel decom-position) 프레임워크인 포크-조인(fork-join) 패키지 추가 자바 8 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림 지원 이처럼 자바로 동시성 프로그램을 작성하기가 점점 쉬워지고 있다. 하지만, 동시성 프로그래밍을 할 때는 안전성(safety)과 응답 가능(liveness) 상태를 유지하기 위해 애써야 한다. 병렬 스트림 파이프라인 프로그..

반환 타입으로는 스트림보다 컬렉션이 낫다 - [7장. 람다와 스트림(아이템47)]
📙 1. 원소 시퀀스 반환 타입 비교 일련의 원소(원소 시퀀스)를 반환하는 메서드는 수없이 많다. 이런 메서드의 반환 타입으로 Collection, Set, List와 같은 인터페이스, Iterable, 배열, 스트림이 존재한다. 이 중 가장 적합한 타입은 컬렉션 인터페이스다. 만약, API를 스트림만 반환하도록 짜놓으면 반환된 스트림을 for-each로 반복하길 원하는 사용자는 당연히 불만을 토로할 것이다. 스트림을 반복하기 위해서는 아래와 같은 우회 방법을 선택해야 한다. for (ProcessHandle ph : (Iterable) ProcessHandle.allProcesses()::iterator) { ... } 작동은 하지만 실전에 쓰기에는 너무 난잡하고 직관성이 떨어진다. 그래서 아래와 같이..

스트림에서는 부작용 없는 함수를 사용하라 - [7장. 람다와 스트림(아이템46)]
📙 1. 스트림의 핵심 스트림은 그저 또 하나의 API가 아닌, 함수형 프로그래밍에 기초한 패러다임이다. 스트림 패러다임의 핵심은 계산을 일련의 변환(transformation)으로 재구성하는 부분이다. 이때 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수 함수여야 한다. 순수 함수란 오직 입력만이 결과에 영향을 주는 함수다. 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않아야 한다. 이를 위해서는 (중간 단계든 종단 단계든) 스트림 연산에 건네는 함수 객체는 모든 부작용(side effect)이 없어야 한다. 그렇다면 만약 부작용(side effect)이 발생하면 어떻게 될까? 아래와 같은 문제점이 발생하게 된다. 가독성 Stream을 사용한 순간 데이터의 변..

스트림은 주의해서 사용하라 - [7장. 람다와 스트림(아이템45)]
📙 1. 스트림의 특징 다량의 데이터 처리 작업(순차적이든 병렬적이든)을 돕고자 자바 8에 스트림 API가 추가되었다. 스트림의 특징은 아래와 같다. 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값(int, long, double)이다. 스트림 파이프라인은 소스 스트림에서 시작해 종단 연산(terminal operation)으로 끝나며, 그 사이에 하나 이상의 중간 연산(intermediate operation)이 있을 수 있다. 각 중간 연산은 스트림을 어떠한 방식으로 변환할 수 있다. 예를 들어, 각 원소에 함수를 적용하거나 특정 조건을 만족 못하는 원소를 걸러낼 수 있다. 스트림 파이프라인은 지연 평가(lazy evaluation)된다. 평가는 종단 연산이 호출될 때 이뤄지며, 종단 연산에 ..

ordinal 인덱싱 대신 EnumMap을 사용하라 - [6장. 열거 타입과 애너테이션(아이템37)]
배열의 인덱스를 얻기 위해 ordinal을 쓰는 거은 일반적으로 좋지 않으니, 대신 EnumMap을 사용하도록 하자. 아래의 2가지 상황(일차원 관계, 다차원 관계)을 통해 왜 EnumMap을 사용해야 하는지 알아보도록 하자. 1. 1차원 관계에서의 EnumMap 아래의 Plant 클래스를 통해 식물의 이름(name)과 생애주기(lifeCycle)를 간단히 나타낼 수 있다. public class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } // 한해살이, 여러해살이, 두해살이 final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { thi..

입출력(I/O)(1) - 노드 스트림, 보조 스트림
구체적인 내용에 들어가기에 앞서 기본적인 단어 3개를 살펴보자. I/O란 Input/Ouput의 약자로 입력과 출력을 나타낸다. 노드(Node)란 '데이터의 출발지와 목적지' 또는 '입력과 출력의 끝단'이다. 데이터를 전달하기 데이터를 운반하는 데 사용되는 연결 통로가 필요한데 그것이 스트림(Stream)이다. 이번 주제에서는 입출력을 가능하게 하는 노드 스트림, 이를 도와주는 보조 스트림, 그리고 직렬화(Serialization)를 알아보자. 1. 노드 스트림 🛴 노드 스트림이란 노드에 연결된 스트림이다. 다양한 노드 스트림들이 있는데 3가지 조건으로 분류를 하여 그것에 해당하는 노드스트림을 사용하면 된다. 3가지 분류는 아래와 같다. 데이터 타입 전송할 데이터 타입이 Byte인지 아니면 Char인지 ..