@markdown
# Java Generic
____
## 제네릭(Generic) 타입
- 컴파일 단계에서 잘못된 타입 사용될 수 있는 오류 제거 가능
- 컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용
- 컴파일 시 강한 타입 체크 가능
- 빈번한 타입 변환을 줄 일 수 있다.
<pre><code class="java" style="font-size:14px">타입 변환 코드
List list = new List();
list.add("hello");
String str = (String)list.get(0);
</code></pre>
<pre><code class="java" style="font-size:14px">타입 변환 제거 코드
List<String> list = new List<String>();
list.add("hello");
String str = list.get(0);
</code></pre>
## 멀티 타입 파라미터
____
- 두개 이상의 타입 파라미터 사용가능
`class<K, V, ...> { ... }`
`interface<K, V, ...> { ... }`
- 제네릭 메소드
`public <타입 파라미터> 리턴타입 메소드명,...) { ... }`
`public<T> Box<T> boxing(T t) { ... }`
## 제한된 타입 파라미터
____
- 상속 및 구현 관계 이용해 타입 제한
`public <T extends 상위 타입>`
## 와일드카드 타입 3가지
____
- 제네릭타입<?> : Unbounded Wildcards
- 제네릭타입<? extends 상위타입> : Upper Bounded Wildcards(상위 클래스 제한)
- 제네릭타입<? super 하위타입> : Lower Bounded Wildcards(하위 클래스 제한)
# Java Collection Framework(컬렉션)
____
- 객체를 수집해 저장하는 것
- 배열의 성능을 보완함
- 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리
- List, Set, Map 3가지가 있다.
## List 컬렉션
____
- ArrayList, Vector, LinkedList
- 특징
1. 인덱스로 객체 관리
2. 중복 저장 가능
### Vector
- `List<E> list = new Vector<E>();`
- Vector는 스레드 동기화 기능으로 복수의 스레드가 동시에 Vector 접근해 객체 추가, 삭제하더라도 안전하다(thread safe)
### LinkedList
- `List<E> lise = new LinkedList<E>();`
- 인접 참조를 링크해 체인 방식으로 객체 관리
- 특정 인덱스에서 객체를 삭제하거나 추가해도, 앞뒤 링크만 변경하면 된다.
- ArrayList보다 성능이 좋다.
## Set 컬렉션
____
- 특징
1. 객체 중복 저장 불가
2. 저장 순서가 유지되지 않음
- `HashSet`, `LinkedHashSet`, `TreeSet`
- Set에 저장된 전체 객체 대상으로 한 번씩 반복해 가져오는 `Iterator` 제공
`Iterator<E> iterator()`
- `new`로 객체를 생성해 `Set`에 저장하면 `HashCode`가 다르기 때문에 같은 데이터를 가진 객체가 중복 저장된다.
- `equals()`, `HashCode()` 메소드를 재정의해 중복을 피하도록 한다.
## Map 컬렉션
____
- 특징
1. 키(key)와 값(value)으로 구성된 Map.Entry 객체를 저장하는 구조
2. 키와 값은 모두 객체
3. 키는 중복될 수 없지만 값은 중복 저장 가능
`Map<Key, Value> map = new HashMap<Key, Value>();`
### Hashtable
- Hashtable은 스레드 동기화가 된 상태로, thread safe하다.
## 검색 기능에 특화된 컬렉션
____
- `TreeSet`, `TreeMap`
- 이진 트리 구조로 정렬이 쉽다.
### TreeSet
- 이진 트리 기반의 Set 컬렉션
- 검색 메소드 : first(), last(), lower(), higher()
- 정렬 메소드 : descendingIterator(), descendingSet()
- 범위 검색 메소드 : headSet(), tailSet, subSet()
### TreeMap
- 이진 트리(binary tree) 를 기반으로 한 Map 컬렉션
- 키와 값이 저장된 Map.Entry를 저장
- 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성
- 검색 메소드 : firstEntry(), lastEntry(), lowerEntry(), higherEntry()
- 정렬 메소드: descendingKeySet(), descendingMap()
- 범위 검색 메소드: headMap(), tailMap, subMap()
## LIFO와 FIFO 컬렉션
____
### Stack 클래스
- `Stack<E> stack = new Stack<E>();`
- LIFO(후입선출) 구조
- push() : 객체 삽입
- peek() : 스택 맨위 객체를 가져옴(제거X)
- pop() : 스택 맨위 객체를 가져오고, 스택에서 삭제한다.
### Queue 인터페이스
- `Queue queue = new LinkedList();`
- FIFO(선입선출) 구조
- offer(E e) : 객체 삽입
- peek() : 객체를 큐에서 가져옴(삭제X)
- poll() : 객체를 가져오고, 큐에서 삭제한다.
# Java Input / Output
____
## 표준 스트림
- 표준 스트림 : `InputStream` / `OutputStream`
- 바이트 기반의 IO
- 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보내는 것 가능
## 보조 스트림
____
- 표준 스트림의 1byte 입력을 도와주는 스트림(한글자씩 읽던 것을 한줄씩 읽는 것)
- 문자열 입력을 수월하게 함
- `InputStreamReader`, `OutputStreamReader`
## 성능 향상 보조 스트림
____
- 입출력 성능에 영향을 미치는 입출력 소스(HDD, Slow Network)를 읽을때 직접 작업하지 않고 버퍼(buffer)와 작업한다.
- 버퍼가 차게되면 데이터를 한꺼번에 HDD로 보내 출력 횟수를 줄여줌으로서 실행성능 향상을 얻을 수 있다.
- 입력 : `BufferedInputStream`, `BufferedReader`
- 출력 : `BufferedOutputStream`, `BufferedWriter`
## 객체 입출력 보조 스트림
____
- 객체를 파일 또는 네트워크로 입출력 할 수 있는 기능 제공
- 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터 변경 필요
- `ObjectInputStream`,`ObjectOutputStream`
- Java에서는 `Serializable` 인터페이스를 구현한 클래스만 직렬화 할 수 있다.
'Java' 카테고리의 다른 글
Java - MVC, 정적 쿼리, 동적 쿼리 (1) | 2017.05.21 |
---|---|
Java - JDBC 사용 및 DB 연결 (0) | 2017.05.20 |
Java 문법 - String, Arrays, Thread (0) | 2017.05.08 |
Java 문법 - hashCode(), 객체 복제 (0) | 2017.05.02 |
Java 문법 - Inner 클래스, 예외처리 (0) | 2017.05.01 |