데이터를 효율적으로 다루기 위한 클래스들의 집합
<Collection 인터페이스를 구현하는 클래스>
Set, List, Queue, Map
<제공된 메서드>
메서드 | 설명 |
---|---|
add(E e) | 지정요소(e) 추가 |
contains(Object obj) | 객체 obj 존재여부 |
isEmpty() | 컬렉션 비어있는지 여부 |
isIterator() | 컬렉션 iterator 반환 |
remove(Object obj) | 객체 obj 제거 |
size | 요소 개수 반환 |
* iterator: 컬렉션 요소에 접근해서 반복적으로 요소 접근 시 도움을 주는 객체
클래스가 다룰 객체를 미리 명시하는 기법
제네릭 == 일반화
ex) 택시를 다루던, 버스를 다루던 그냥 자동차(일반화)라고 다룬다.
→ 제네릭은 모든 종류의 타입을 다룰 수 있도록, 클래스나 메서드를 타입 매개변수를 이용하여 선언한 기법(일반화)
클래스명 뒤에 < E >, < K >, < V >와 같은 형식으로 사용
단, <> 안에는 구현 시에는 알파벳, 사용 시에는 클래스만 들어갈 수 있다.
1) 제네릭 클래스: 클래스 뒤에 제네릭 기법 사용
2) 제네릭 메서드: 메서드 뒤에 제네릭 기법 사용
관례적으로 사용되는 타입명은 하나의 대문자 알파벳 사용
public static void main(String[] args) {
Value v = new Value();
v.typeSearch(3);
v.typeSearch(3.14);
v.typeSearch(3.14f);
v.typeSearch('a');
v.typeSearch("hello");
v.typeSearch(true);
}
}
class Value{
public <T> void typeSearch(T x) {
if(x instanceof Integer) {
System.out.println(x+"는 정수입니다.");
}
else if(x instanceof Double|| x instanceof Float) {
System.out.println(x+"는 실수입니다.");
}
else if(x instanceof Character) {
System.out.println(x+"는 문자형입니다.");
}
else if(x instanceof String) {
System.out.println(x+"는 문자열입니다.");
}
else if(x instanceof Boolean) {
System.out.println(x+"는 논리형입니다.");
}
}
}
###출력값
3는 정수입니다.
3.14는 실수입니다.
3.14는 실수입니다.
a는 문자형입니다.
hello는 문자열입니다.
true는 논리형입니다.
사용할 때 어떤 타입인지 정확히 명시를 해야함
public static void main(String[] args) {
A<Integer>a1=new A<>();
a1.x=10;
a1.y=20;
System.out.println(a1.x+a1.y);
A<String>a2 = new A<>();
a2.x="hello ";
a2.y="world";
System.out.println(a2.x+a2.y);
}
}
class A<T>{
T x;
T y;
}
요소들을 집합적으로 모아놓은 자료구조
생성자 | 설명 |
---|---|
HashSet() | HashSet 클래스의 기본 생성자 |
HashSet(Collection c) | 컬렉션의 요소로 HashSet 객체 생성 |
HashSet(int capacity) | capacity 용량을 갖는 객체 생성 |
HashSet과 TreeSet 비교
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add("demon");
hs.add("banana");
hs.add("tomato");
hs.add("apple");
hs.add("cargo");
TreeSet ts = new TreeSet();
ts.add("demon");
ts.add("banana");
ts.add("tomato");
ts.add("apple");
ts.add("cargo");
Iterator it = hs.iterator();
System.out.println("<Hash Set 출력>");
while(it.hasNext()) {
System.out.println(" "+it.next());
}
System.out.println();
Iterator it2=ts.iterator();
System.out.println("<Tree Set 출력>");
while(it2.hasNext()) {
System.out.println(" "+it2.next());
}
System.out.println();
System.out.println("현재 TreeSet의 크기: " +ts.size());
}
}
//출력값
<Hash Set 출력>
banana
apple
demon
tomato
cargo
<Tree Set 출력>
apple
banana
cargo
demon
tomato
현재 TreeSet의 크기: 5
데이터를 일렬로 늘어놓은 구조
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
list1.add("A");
list1.add("C");
list1.add("E");
list1.add("D");
System.out.println("초기상태");
System.out.println(list1);
System.out.println("인덱스1 위치에 B 추가");
list1.add(1, "B");
System.out.println(list1);
System.out.println("인덱스2 위치의 값 삭제");
list1.remove(2);
System.out.println(list1);
System.out.println("인덱스2 위치의 값 반환: " +list1.get(2));
}
}
##출력값
초기상태
[A, C, E, D]
인덱스1 위치에 B 추가
[A, B, C, E, D]
인덱스2 위치의 값 삭제
[A, B, E, D]
인덱스2 위치의 값 반환: E
LinkedList와 ArrayList의 작업 시간 비교
public static void main(String[] args) {
ArrayList al = new ArrayList();
LinkedList ll = new LinkedList();
long start = System.currentTimeMillis();
for(int i=0;i<100000;i++) {
al.add(0,String.valueOf(i));
}
long end = System.currentTimeMillis();
System.out.println("ArrayList 작업시간: " + (end-start));
start = System.currentTimeMillis();
for(int i = 0;i<100000;i++) {
ll.add(0,String.valueOf(i));
}
end=System.currentTimeMillis();
System.out.println("LinkedList 작업시간: " + (end-start));
}
}
## 출력값
ArrayList 작업시간: 287
LinkedList 작업시간: 5
메서드 | 설명 |
---|---|
add(int index, E elem) | index 위치에 elem 추가 |
get(int index) | index 위치에 있는 요소 반환 |
indexOf(Object o) | 요소 o가 있는 위치 반환 |
listiterator() | Listiterator() 반환 |
remove(int index) | index 위치 요소 삭제 후 삭제값 반환 |
set(int index, E elem) | index 위치 요소를 elem으로 변경 |