Generic 제네릭
1. 제네릭
- 매개변수화된 자료형
- 클래스 / 인터페이스 / 메소드 적용
- 제네릭 클래스 / 제네릭 인터클래스 / 제네릭 메소드
2. 제네릭 클래스의 형태
- 클래스명<매개변수 타입 리스트> { ... }
- 클래스명<타입> 객체명 = new 클래스명<타입>();
3. 제네릭에 이용할 수 있는 자료형
- 제네릭으로 사용할 수 있는 자료형 : 레퍼런스 형
(int, double 같은 기본 자료형은 사용 불가 / 사용하려면 wrapper 클래스인 Integer, Double 이용해야 함)
4. 제한된 제네릭 타입
<T extends V>
- 이렇게 적으면 제네릭 T 자리에는 클래스 타입이 V이거나 V클래스의 하위 클래스 타입만 올 수 있다.
5. 와일드카드 인수
- 와일드카드 : '?' 로 나타낸다.
- 와일드카드 자리에는 어떤 클래스 타입도 올 수 있다.
컬렉션 프레임워크(Collection Framework)
배열 외에도 ArrayList, LinkedList, Stack 등 많은 데이터를 일정한 구조로 저장할 수 있도록 해주는 클래스들을 모아 '컬렉션 프레임워크'라고 한다. 이 때 메모리 공간에 어떤 객체라도 저장하려면 다양한 객체를 받을 수 있는 제네릭을 필요로 한다.
1. List
- 순서가 있는 데이터 집합으로 데이터 중복을 허용한다.
- 구현 클래스 : ArrayList / LinkedList, Stack, Vector 등
2. Set
- 순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.
- 구현 클래스 : HashSet / TreeSet 등
3. Map
- <key, value> 쌍으로 이루어진 데이터 집합으로 순서가 없다.
- key 중복불가 / value 중복가능
- 구현 클래스 : HashMap / TreeMap / Hashtable / Properties 등
Collection 인터페이스의 주요 메소드
컬렉션 프레임워크의 인터페이스 중 List, Set, Map 인터페이스가 특히 중요하다. 이들은 모두 Collection 인터페이스를 상속받기 때문에 Collection 인터페이스에서 많이 사용하는 메소드도 알아두어야 한다.
1. Collection에 객체 추가
boolean add(E e)
boolean addAll(Coolection<? extends E> c)
2. Collection에 저장된 모든 객체 삭제
void clear()
3. Collection에 객체 또는 다른 Collection이 포함되어 있는지 판단
boolean contains(Object o)
boolean containsAll(Collection<?> c)
4. Collection을 순환할 반복자(iterator)를 반환
iterator<E> iterator()
5. Collection에서 객체를 삭제
boolean remove(Object o)
boolean removeAll(Cooleantion<?> c)
6. Collection에 포함된 원소의 개수를 반환
int size()
List 인터페이스
▶▶▶ List<E> : 데이터 저장순서 유지 O / 동일한 인스턴스 중복저장 O
▶▶▶ Set<E> : 데이터 저장순서 유지 X / 동일한 인스턴스 중복저장 X
List인터페이스
- 객체가 저장되는 순서가 있고, 중복을 허용
- 하위 클래스 : ArrayList / Vector / LinkedList 등
1. ArrayList
- 저장소의 용량을 늘리는 과정에서 많은 시간이 소요된다.
- 데이터의 삭제에 필요한 연산과정이 길다.
- 데이터의 참조가 용이해서 빠른 참조가 가능하다.
배열은 크기를 늘리거나 줄일 수 없고, 더 많은 데이터를 넣으려면 배열을 새로 만들어야 한다. 그러나 ArrayList는 add 메소드를 이용하여 얼마든지 원하는만큼 데이터를 저장할 수 있다.
Collection 인터페이스에 있는 메소드들이 오버라이딩 되어 제공되기 때문에 add(), size() 등의 메소드를 바로 사용할 수 있다.
for-each 구문 & 반복자 iterator
for(String x : num)
System.out.println(x);
for 반복문을 for-each 구문으로 해도 되지만, 배열처럼 루프를 수행 할 수는 없기 때문에 루프를 수행하려면 반복자 이터레이터(iterator)를 이용하여 자동으로 반복이 수행될 수 있도록 해야 한다.
2. LinkedList
- 저장소의 용량을 늘리는 과정이 간단하다.
- 데이터의 삭제가 매우 간단하다.
- 데이터의 참조가 다소 불편하다.
3. Stack
- 양쪽이 아닌 한 쪽 끝에서만 데이터의 추가/삭제가 일어난다.
- 먼저 들어간 데이터가 나중에 필요할 때 사용할 수 있다.
- 탑(top) : 데이터의 삽입/삭제가 일어나는 곳
(1) Stack 생성자
Stack() : 빈 스택을 생성함
(2) Stack 메소드
boolean empty() : 스택이 비었는지 판단
E peek() : 스택 탑에 있는 원소를 반환
E pop() : 스택 탑에 있는 원소를 삭제하고 반환
E push(E item) : 스택 탑에 원소 item 추가
int search(Object o) : 스택에서 객체 o를 찾아서 있으면 위치를 반환
4. Queue
- 한 쪽에서 데이터가 추가 / 반대쪽에서 데이터를 삭제
(1) Queue 메소드
boolean add(E e) : 원소 e를 큐에 추가 / 공간이 부족하면 IllegalStateException 발생
E element() : 큐의 헤드에 있는 원소를 반환 / 삭제 x
boolean offer(E e) : 원소 e를 큐에 추가
E peek() : 큐의 헤드에 있는 원소를 반환 / 삭제 x / 큐가 비었으면 null을 반환
E poll() : 큐의 헤드에 있는 원소를 반환 / 삭제 o / 큐가 비었으면 null을 반환
E remove() : 큐의 헤드에 있는 원소를 반환 / 삭제 o
5. Iterator & ListIterator
- Iterator 는 컬렉션 프레임워크에서 순환자 역할
- 자동으로 원소를 하나씩 순환해 나가는 특별한 인터페이스
- 재사용되지 않기 때문에 다시 사용하려면 이터레이터를 다시 얻어야 한다.
(1) Iterator 메소드(한방향 순환)
boolean hasNext() : 이후에 원소가 더 있는지 판단 / 더 있으면 true 반환
E next() : 다음 원소 반환
(2) ListIterator 메소드(양방향 순환)
boolean hasNext() : 이후에 원소가 더 있는지 판단 / 더 있으면 true 반환
boolean hasPrevious() : 이전에 원소가 있는지 판단 / 있으면 true 반환
E next() : 다음 원소 반환
E previous() : 이전 원소 반환
Set 인터페이스
▶▶▶ List<E> : 데이터 저장순서 유지 O / 동일한 인스턴스 중복저장 O
▶▶▶ Set<E> : 데이터 저장순서 유지 X / 동일한 인스턴스 중복저장 X
Set인터페이스
- 순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.
- 구현 클래스 : TreeSet / HashSet
1. TreeSet
- 이진 트리 구조 형태 → 데이터를 저장하면서 자동으로 정렬의 형태를 취함
- TreeSet에 넣는 데이터는 대소 비교가 가능해야 한다.
(그래서 Comparable인터페이스이나 Comparator인터페이스 사용)
(1) Comparable 인터페이스
- 보통 기본 정렬기준을 구현할 때 사용
- wrapper (boolean제외), String, Date, File 클래스 등은 알아서 오름차순 정렬
- Test, Person 등과 같은 Comparable을 구현하지 않는 클래스는 TreeSet에 담으면 예외상황 발생
- 방법 : compareTo 메소드를 오버라이딩 해준다.
(2) Comparator 인터페이스
- 보통 기본 정렬기준 외에 다른 기준을 구현하고자 할 때 사용
- compare(Object o1, Object o2) 를 구현해준다.
- equals메소드 : Comparetor 를 구현하는 클래스는 오버라이딩이 필요할 수도 있음을 정의한 것(반드시 구현x)
interface Comparator {
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
2. HashSet
- HashSet 구조 역시 Set의 일종
- 순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.
- 데이터의 중복 검사를 위해 equals메소드 & hashCode 메소드 오버라이딩 필수
(hashCode메소드의 반환값을 hash값으로 활용, equals메소드의 반환값을 이용해서 내용 비교)
public int hashCode() {
reuturn 비교대상
}
public boolean equals(Object obj) {
return true, false 비교식
}
Set 인터페이스
Map인터페이스
- <키, 값>의 쌍으로 한 개의 데이터를 구성하는 자료 구조 (키는 유일해야 하고, 값은 중복이 있을 수 있음)
- HashMap, TreeMap
1. HashMap
- hash 함수 이용(키 값을 입력하면 hash값을 출력)
(1) HashMap 생성자
HashMap() : 빈 HashMap 생성
(2) HashMap 메소드
- void clear() : HashMap의 모든 데이터 삭제
- boolean containsKey(Object key) : key에 해당하는 키가 존재하는지 판단
- boolean containsValue(Objext value) : value에 해당하는 값이 존재하는지 판단
- Set<Map.Entry<K, V>> entrySet() : 모든 엔트리 반환
- V get(Object key) : key에 해당하는 값 반환
- Set<K> keySet() : key들의 집합 반환
- V put(K key, V value) : <key, value> 쌍을 HashMap에 추가
- V remove(Object key) : key에 해당하는 데이터 삭제
- int size() : HashMap의 크기 반환
2. TreeMap
- 키를 기준으로 정렬이 이루어짐
- 키에 해당하는 클래스를 Compareble 또는 Comparator 인터페이스로 구현해야 한다.
(1) TreeMap메소드
- void clear() : HashMap의 모든 데이터 삭제
- boolean containsKey(Object key) : key에 해당하는 키가 존재하는지 판단
- boolean containsValue(Objext value) : value에 해당하는 값이 존재하는지 판단
- Set<Map.Entry<K, V>> entrySet() : 모든 엔트리 반환
- V get(Object key) : key에 해당하는 값 반환
- Set<K> keySet() : key들의 집합 반환
- Collection values() : value들의 집합 반환
- V put(K key, V value) : <key, value> 쌍을 HashMap에 추가
- V remove(Object key) : key에 해당하는 데이터 삭제
- int size() : HashMap의 크기 반환
'Java > Day28' 카테고리의 다른 글
[Java] Generic 제네릭 예제 (0) | 2021.12.13 |
---|---|
[Java] Generic 제네릭 Step (0) | 2021.12.13 |