java 15

커스텀 집계(reduce())

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

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

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

스트림 파이프라인

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

스트림 소개

스트림(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("홍길동", "신용권" "김자바")..

병렬 처리를 위한 컬렉션

동기화된(synchronized) 컬렉션은 멀티 스레드 환경에서 하나의 스레드가 요소를 안전하게 처리하도록 도와주지만 전체 요소를 빠르게 처리하지는 못한다. 하나의 스레드가 요소를 처리할 때 전체 잠금이 발생하여 다른 스레드는 대기 상태가 된다. 그렇기 때문에 멀티 스레드가 병렬적으로 컬렉션의 요소들을 처리 할 수 없다. 자바는 멀티 스레드가 컬렉션의 요소를 병렬적으로 처리 할 수 있도록 특별한 컬렉션을 제공하고 있다 java.util.concurrent 패키지의 ConcurrentHashMap과 ConcurrentLinkedQueue이다. ConcurrentHashMap은 Map 구현 클래스 이고, ConcurrentLinkededQueue는 Queue 구현 클래스 이다. ConcurrentHashMa..

검색 기능을 강화 시킨 컬렉션

컬렉션 프레임워크는 검색 기능을 강화시킨 TreeSet과 TreeMap을 제공하고 있다. 이름에서 알 수 있듯이 TreeSet은 Set 컬렉션이고, TreeMap은 Map 컬렉션이다. 이컬렉션들은 이진 (binary tree)를 이용해서 계층적 구조(Tree 구조)를 가지면서 객체를 저장한다. 이진트리 구조 이진 트리(Binary tree)는 여러 개의 노드(node)가 트리 형태로 연결된 구조로, 루트 노드(root node) 라고 불리는 하나의 노드에서 부터 시작해서 각 노드에 최대 2개의 노드를 연결할 수 있는 구조를 가지고 있다. 위 아래로 연결된 두 노드를 부모-자식 관계에 있다고 하며 위의 노드를 부모 노드, 아래의 노드를 자식 노드라고 한다. 하나의 부모 노드는 최대 두개의 자식 노드와 연결..

List 컬렉션

List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다. List 컬렉션은 객체 자체를 저장하는 것이 아니라 다음 그림과 같이 객체의 번지를 참조한다. 동일한 객체를 중복 저장할 수 있는데 이경우 동일한 번지가 참조된다, null도 저장이 가능한데, 이 경우 해당 인덱스는 객체를 참조하지 않는다. List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있는데, 다음은 List 컬렉션에서 공통적으로 사용 가능한 List 인터페이스의 메소드들이다. 인덱스로 객체를 관리하기 때문에 인덱스를 매개값으로 갖는 메소드가 많다 기능 메소드 설명 객체추가 bool..

java.time 패키지

자바 7이전 까지는 Date와 Calendar 클래스를 이용해서 날짜와 시간 정보를 얻을 수 있었다. Date 클래스의 대부분의 메소드는 Deprecated 되었고 , Date의 용도는 단순히 특정 시점의 날자 정보를 저장하는 역할만 한다 . Calendar 클래스는 날짜와 시간 정보를 얻기 에는 충분하지만, 날짜와 시간을 조작하거나 비교하는 기능이 불충분하다. 자바 8부터 날짜와 시간을 나타내는 여러가지 API를 새롭게 추가했다. 이 API는 java.util 패키지에 없고 별도로 java.time 패키지와 하위 패키로 제공 된다 패키지 설명 java.time 날짜와 시간을 나타내는 핵심 API인 LocalDate, LocalTime, LocalDateTime, ZonedDateTime을 포함하고 있다..

Wrapper(포장) 클래스

자바는 기본타입 (byte, char, short, int, long, float, double, boolean) 의 값을 갖는 객체를 생성 이런 객체를 포장(Wrapper) 객체 기본 타입의 값을 내부에 두고 포장하기 때문 포장 객체의 특징은 포장하고 있는 기본 타입 값은 외부에서 변경할수 없다 내부의 값을 변경하고 싶다면 새로운 포장객체를 만들어야 함 java.lang 패키지에 포함 기본 타입 포장 클래스 byte Byte char Character short Short int Integer long Long float Float double Double boolean Boolean 박싱(Boxing)과 언박싱(Unboxing) 기본 타입의 값을 포장 객체로 만드는 과정을 박싱(Boxing) 포장 객..

Array 클래스

Arrays 클래스는 배열 조작 기능을 가지고 있다. 배열 조작이란 배열의 복사, 항목 정렬, 항목 검색 과 같은 기능을 말한다 단순한 배열 복사는 System.arraycopy() 메소드를 사용할수 있으나 Arrays 는 추가적으로 항목 정렬, 항목 검색, 항목 비교와 같은 기능을 제공해준다 Arrays 클래스는 모든 메소드는 정척(Static)이므로 Arrays 클래스로 바로 사용이 가능 리턴 타입 메소드 이름 설명 int binarySearch(배열, 찾는값) 전체 배열 항목에서 찾는 값이 있는 인덱스 리턴 타겟 배열 copyOf(원본배열, 복사할 길이) 원본 배열의 0번 인덱스에서 복사할 길이만큼 복사할 배열 리턴, 복사할 길이는 원본 배열의 길이보다 커도 되며, 타겟 배열의 길이가 된다. 타겟 ..