Collections
컬렉션의 동기화 synchronized()
변경불가 컬렉션 만들기 unmodifiable()
싱글톤 컬렉션 singlaton()
한 종류의 객체만 저장하는 컬렉션 checked()
컬렉션 클래스 정리 & 요약
컬렉션 | 특징 |
ArrayList | 배열기반, 데이터의 추가와 삭제에 불리, 순차적인 추가삭제는 제일 빠름. 임의의 요소에 대한 접근성이 뛰어남 |
LinkedList | 연결기반, 데이터의 추가와 삭제에 유리. 임의의 요소에 대한 접근성이 좋지 않다 |
Stack | vector를 상속받아 구현 |
Queue | LinkedList가 Queue인 인터페이스를 구현 |
HashSet | HashMap을 이용해서 구현 |
TreeSet | TreeMap을 이용해서 구현 |
HashMap | 배열과 연결이 결합된 형태. 추가, 삭제, 검색, 접근성이 모두 뛰어남. 검색에는 최고성능을 보인다 |
TreeMap | 연결기반, 정렬과 검색(특히 범위검색)에 적합 검색성능은 HashMap보다 떨어짐 |
Properties | Hashtable을 상속받아 구현 |
LinkedHashMap, LinkedHashSet |
HashMap과 HashSet에 저장순서 유지기능을 추가 |
지네릭스(Generics)
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입을 체크해주는 기능이다
객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다
선언방식 : ArrayList<E> // E는 타입변수이다
타입변수
클래스를 작성할 때, Object타입 대신 타입변수를 선언해서 사용
Object -> E 다른 단어로도 가능 보통은 E(element)혹은 T(type)를 사용
지네릭스의 장점
타입 안정성을 제공한다
타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다
지네릭스 용어
Box<T> : 지네릭 클래스, T의 Box 또는 T Box라고 읽는다 T : 타입변수 또는 타입 매개변수. (T는 타입문자) Box : 원시 타입(raw type) |
class Box<T> 지네릭 클래스 선언
지네릭 타입과 다형성
참조변수와 생성자의 타입은 일치해야 한다
ArrayList<Tv> list = new ArrayList<Tv>();
지네릭 클래스간의 다형성은 성립(대입된 타입은 일치해야 함)
ArrayList<Tv> list = new ArrayList<Tv>();
지네릭스의 제한
타입 변수에 대입은 인스턴스 별로 다르게 가능하다
1 static 멤버에 타입 변수 사용 불가
2 배열 생성할 때 타입 변수 사용불가. 타입 변수로 배열 선언은 가능
제한된 지네릭 클래스
타입 매개변수 T에 지정할 수 있는 타입의 종류를 제한하는 법 :
extends로 대입할 수 있는 타입을 제한한다
class FruitBox<T extends Fruit> //fruit의 자손만 타입으로 지정가능
Iterator<E>
클래스를 작성할 때, Object 타입 대신 T와 같은 타입 변수를 사용
HashMap<K,V>
여러 개의 타입변수가 필요한 경우, 콤마()를 구분자로 선언
와일드 카드
하나의 참조변수로 대입된 타입이 다른 객체를 참조가능.
메서드의 매개변수에 와일드 카드를 사용
<? extends T> : 와일드 카드의 상한 제한. T와 그 자손들만 가능 <? super T> : 와일드 카드의 하한 제한. T와 그 조상들만 가능 <?> : 제한 없음, 모든 타입이 가능. <T extends Object>와 동일 |
지네릭 메서드
지네릭 타입이 선언된 메서드 //타입 변수는 메서드 내에서만 유효
static <T> void sort(List<T> list, Comparator<? super T> c)
**클래스의 타입 매개변수<T>와 메서드의 타입 매개변수 <T>는 별개
메서드를 호출할 때마다 타입을 대입해야한다(대부분 생략가능)
메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략 불가.
지네릭 타입의 형변환
지네릭 타입과 원시 타입간의 형변환은 가능하지만, 경고가 발생한다
Box box = (Box)objBox; //지네릭 타입 -> 원시타입 경고발생
objBox = (Box<Object>)box; //원시타입 -> 지네릭 타입 경고발생
*와일드 카드가 포함된 지네릭 타입으로는 형변환 가능
지네릭 타입의 제거
컴파일러는 지네릭 타입을 제거하고 필요한 곳에 형변환을 넣는다
1. 지네릭 타입의 경계(bound)를 제거
2. 지네릭 타입 제거 후에 타입이 불일치하면 형변환을 추가
3. 와일드 카드가 포함된 경우, 적절한 타입으로 형변환 추가