Back-end 100

스트림 파이프라인

대량의 데이터를 가공해서 축소하는 것을 일반적으로 리덕션(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("홍길동", "신용권" "김자바")..

병렬 처리를 위한 컬렉션

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

동기화된 컬렉션

컬렉션 프레임워크는 대부분의 클래스들은 싱글 스레드 환경에서 사용할수 있도록 설계되었다. 여러 쓰레드가 동시에 컬렉션에 접근한다면 의도하지 않게 요소가 변경될 수 있는 불완전한 상태가 된다. Vector와 Hashtable 은 동기화된(synchronized) 메소드로 구성되어 있어 멀티쓰레드 환경 안전하게 요소를 처리할수 있지만 ArrayList, HashSet, HashMap을 싱글 스레드 환경에서 사용하다가 멀티 스레드 환경으로 전달할 필요도 있을 것이다. 이런 경우를 대비해 컬렉션 프레임워크는 비동기화된 메소드를 동기화된 메소드로 래핑하는 Colletions의 synchronizedXXX() 메소드를 제공한다 매개값으로 비동기화된 컬렉션을 대입하면 동기화된 컬렉션을 리턴한다.

LIFO 와 FIFO 컬렉션

후입선출(LIFO : Last In First Out)은 나중에 넣은 객체가 먼저 빠져나가는 자료구조를 말한다 선입선출(FIFO: Firest In First Out)은 먼저 넣은 객체가 먼저 빠져나가는 구조를 말한다. 컬렉션 프레임워크에는 LIFO 자료구조를 제공하는 스택(Stack) 클래스와 FIFO자료 구조를 제공하는 큐(Queue) 인터페이스를 제공한다 스택(Stack)을 응용한 대표적인 예가 JVM 스택 메모리이다 스택 메모리에 저장된 변수는 나중에 저장된 것부터 제거 된다. 큐(Queue)를 응용한 대표적인 예가 스레드풀(ExecutorService)의 작업 큐이다. 작업 큐는 먼저 들어온 작업부터 처리한다. Stack Stack 클래스는 LIFO 자료구조를 클래스이다. Stack 객체를 생성..

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

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

Map 컬렉션

Map 컬렉션은 키(Key) 와 값 (Value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다 키는 중복 저장될 수 없지만 값은 중복 저장 가능하다. 기존에 저장된 키와 동일한 키로 저장할시 기존 값이 새로운 값으로 대체 된다 Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다. 다음은 Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스드의 메소드들이다. 키로 객체들을 관리하기 때문에 키를 매개값으로 갖는 메소드가 많다. 기능 메소드 설명 객체 추가 V put(K key, V value) 주어진 키로 값을 저장, 새로운 키일 경우 null을 리턴하고 동일한 키가 있을 경우 값을..

Set 컬렉션

List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고 , 하나의 null만 저장할 수 있다. Set 컬렉션은 수학의 집합에 비유 될 수 있다. 집한은 순서와 상관없고 중복이 허용되지않기 때문이다. 들어갈(저장할) 때의 순서와 나올(찾을) 때의 순서가 다를수도 있다 Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있다. 아래는 Set 컬렉션에서 공통으로 사용가능한 Set 인터페이스 메소드이다. 인덱스로 관리하지 않기 때문에 인덱스 매개값을 가지는 메소드는 없다. 기능 메소드 설명 객체추가 boolean add(E e) 주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 fa..

List 컬렉션

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