본문 바로가기

Java

Java 문법 - Generic, Collection, IO

@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` 인터페이스를 구현한 클래스만 직렬화 할 수 있다.