Back-end/이것이 자바다[신용권 한빛미디어] 65

IO 패키지 소개 및 입력, 출력 스트림 [IO 기반 입출력 및 네트워킹]

프로그램에서는 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번히 일어난다. 데이터는 사용자로부터 키보드를 통해 입력 될 수도 있고, 파일 또는 네트워크로부터 입력 될 수도 있다, 데이터는 반대로 모니터로 출력 될 수도 있고, 파일로 출력되어 저장 될 수도 있으며 네트워크로 출력되어 전성 될 수도 있다. 자바에서 데이터는 스트림(Stream)을 통해 입출력되므로 스트림의 특징을 잘 이해해야 한다. 스트림은 단일 방향으로 연속적으로 흘러가는것을 말하는데. 물이 높은 곳에서 낮은 곳으로 흐르듯이 데이터는 출발지에서 나와 도착지로 들어 간다는 개념이다 입력 스트림과 출력 스트림 프로그램이 출발지냐 또는 도착지냐에 따라서 스트림의 종류가 결정되는데, 프로그램이 데이터를 입력 받을 때에는 입력 스트림(In..

병렬 처리

병렬 처리(Parallel Operation)란 멀티코어 CPU 환경에서 하나의 작업을 분할해서 각각의 코어가 병력적으로 처리하는 것을 말하는데, 병렬 처리의 목적은 작업 처리 시간을 줄이기 위한 것이다 자바 8부터 요소를 병렬 처리할 수 있도록 하기 위해 병렬 스트림을 제공하기 때문에 컬렉션(배열)의 전체 요소 처리 시간을 줄여준다 동시성(Concurrency)과 병렬성(Parallelism) 멀티 스레드는 동시성(Concurrency) 또는 병렬성(Parallelism)으로 실행되기 때문에 이 용어 들에 대해 정확히 이해하는 것이 좋다. 이 둘은 멀티 스레드의 동작 방식이라는 점에서는 동일하지만 서로 다른 목적을 가지고 있다 동시성은 멀티 작업을 위해 멀티 스레드가 번갈아가며 실행하는 성질을 말하고 ..

수집(collect())

스트림은 요소들을 필터링 또는 매핑한 후 요소들은 수집하는 최종 처리 메소드인 collect()를 제공하고 있다. 이 메소드를 이용하면 필요한 요소만 컬렉션으로 담을 수 있고, 요소들을 그룹핑한 후 집계(리덕션)할 수 있다 필터링한 요소 수집 Stream의 collect(Collector collector) 메소드는 필터링 또는 매핑된 요소들은 새로운 컬렉션에 수집하고 리턴 매개값인 Collector(수집기) 어떤 요소를 어떤 컬렉션에 수지 할 것인지를 결정 Collector 의 타입 파라미터 T는 요소이고, A는 누적기(accumulator)이다, 그리고 R은 요소가 저장될 컬렉션이다, 풀어서 해석하면 T요소를 A누적기가 R에 저장한다는 의미 이다. Collector의 구현 객체는 다음과 같이 Coll..

커스텀 집계(reduce())

커스텀 집계() 스트림은 기본 집계 메소드인 sum(), average(), count(), max(), min() 을 제공하지만, 프로그램화해서 다양한 집계 결과물을 만들 수 있도록 reduce() 메소드도 제공한다. 각 인터페이스에는 매개 타입으로 XXXOperator, 리턴 타입으로 OptionalXXX, int, long, double 을 가지는 reduce() 메소드가 오버로딩 되어있다. 스트림에 요소가 전혀 없을 경우 디폴트 값인 identity 매개값이 리턴된다. XXXOperator 매개값은 집계 처리를 위한 람다식을 대입하는데, 예를들어 학생들의 성적 총점은 학생 스트림에서 점수 스트림으로 매핑해서 다음과 같이 얻을수 있다 int sum = studentList.stream().map(S..

기본 집계(sum(), count(), average(), max(), min())

기본집계() 집계(Aggregate)는 최종 처리 기능으로 요소들을 처리해서 카운팅, 합계, 평균값, 최대값, 최소값 등과 같이 하나의 값으로 산출하는 것을 말한다. 집계는 대량이 데이터를 가공해서 축소하는 리덕션(Reduction) 이라고 볼수 있다. 스트림이 제공하는 기본 집계 이 집계 메소드에서 리턴하는 OptionalXXX 는 자바 8에 추가한 java.util 패키지의 Optional, OptionalDouble, OptionallInt, OptionallLong 클래스 타입을 말한다. 이들은 값을 저장하는 값 기반 클래스(value-based class)들이다 이객체에서 값을 얻기 위해서는 getAsDouble(), getAsInt(), getAsLong() 을 호출하면 된다 package S..

루핑(peek(), forEach()), 매칭 (allMatch(), anyMatch(), noneMatch())

루핑 루핑(looping)은 요소 전체를 반복하는 것을 말한다. 루핑하는 메소드에는 peek(), forEach() 가 있다 이 두 메소드는 루핑한다는 기능에서는 동일하지만, 동작 방식은 다르다. peek()는 중간 처리 메소드이고, forEach()는 최종 처리 메소드이다. peek() 는 중간 처리 단계에서 전체 요소를 루핑하면서 추가적인 작업을 하기 위해 사용한다. 최종 처리 메소드가 실행 되지 않으면 지연되기 때문에, 반드시 최종 처리 메소드가 호출 되어야 동작한다. 예를 들어 필터링 후 어떤 요소만 남았는지 확인하기 위해 다음과 같이 peek() 를 마지막에 호출할 경우 스트림은 전혀 동작하지 않는다 요소 처리의 최종 단계가 합을 구하는 것이라면, peek() 메소드 호출 후 sum() 을 호출..

필터링(distinct(), filter()), 매핑(mapXXX), 정렬(sorted)

필터링 필터링은 중간 처리 기능으로 요소를 걸러내는 역할을 한다. 필터링 메소드인 distinct()와 filter() 메소드는 모든 스트림이 가지고 있는 공통 메소드 distinct() 메소드는 중복을 제거하는데 Stream의 경우 Object.equals(Object) 가 true 이면 동일한 객체로 판단하고 중복을 제거 한다 . IntStream, LongStream, DoubleStream 은 동일값일 경우 중복을 제거 한다. filter() 메소드는 매개값으로 주어진 Predicate가 true를 리턴하는 요소만 필터링 한다. package Stream; import java.util.Arrays; import java.util.List; public class FilteringExample {..

스트림 파이프라인

대량의 데이터를 가공해서 축소하는 것을 일반적으로 리덕션(Reduction) 이라고 하는데, 데이터의 합계, 평군값, 카운팅, 최대값, 최소값 등이 대표적인 리덕션의 결과물이라고 볼 수 있다. 그러나 컬렉션의 요소를 리덕션의 결과물로 바로 집계 할 수 없을 경우에는 집계하기 좋도록 필터링, 매핑, 정렬, 그룹핑 등 중간 처리가 필요하다 중간 처리와 최종 처리 스트림은 데이터의 필터링, 매핑, 정렬, 그룹핑 등 중간 처리와 합계,평균,카운팅,최대값, 최소값 등 최종 처리를 파이프라인(pipelines)으로 해결한다. 파이프라인은 여러 개의 스트림이 연결되어 있는 구조를 말한다. 파이프라인에서 최종처리를 제외하고는 모두 중간 처리 스트림 이다. 중간 스트림이 생성될 때 요소들이 바로 중간 처리(필터링, 매핑..

스트림의 종류

자바 8 부터 새로 추가된 java.util.stream 패키지에는 스트림(stream) API들이 포진하고 있따. 패키지 내용을 보면 BaseStream 인터페이스를 부모로 해서 자식 인터페이스들이 다음과 같은 상속 관계를 이루고 있다. BaseStream 인터페이스에는 모든 스트림에서 사용할 수 있는 공통 메소들이 정의되어 있을 뿐 코드에서 직접적으로 사용되지는 않는다. 하위 스트림인 Stream, IntStream, LongStresam, DoubleStream이 직접적으로 이용되는 스트림인데, Stream => 객체 IntStream => int LongStream => long DoubleStream => double 요소를 처리하는 스트림이다. 스트림 인터페이스의 구현 객체는 다양한 소스로부터..

스트림 소개

스트림(Stream)은 자바 8부터 추가된 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식(함수적-스타일(functional-style)) 으로 처리할 수 있도록 해주는 반복자이다. 반복자 스트림 자바 7 이전까지는 List 컬렉션에서 요소를 순차적으로 처리하기 위해 Iterator 반복자를 사용 List list = Arrays.asList("홍길동", "하성호", "감자바"); Iterator iteaot = list.iterator(); while(iterator.hasNext()){ String name = iterator.next(); System.out.println(name); } -> 스트림으로 변경 List list = Arrays.asList("홍길동", "신용권" "김자바")..