- Collection에서 equals는 필수
Collection에 새로 만든 클래스를 원소로 사용할 때는 반드시 equals를 오버라이딩해야 한다.
(ex) remove(Object o), ~~)
Collection
과 Map
이 여기에 속함
- 기본 데이터타입을 클래스로 표기하는 Wrapper-class
/* 기본 데이터 타입 wrapper class ============================================ byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean */ class CollectionEx1 { public static void main(String[] args) { int num = 5; // int -> Integer Integer iObj = new Integer(num++); // Integer -> int num = iObj.intValue(); System.out.println(num); // double -> Double double d = 3.14; Double dObj = new Double(d++); // Double -> double d = dObj.doubleValue(); System.out.println(d); // JDK 1.5~ // auto-boxing Integer iObj2 = 100; // auto-unboxing int num2 = iObj2; } }
- 사실 generic은 이 Collection Framework때문에 등장했다.
모든 객체가 다 들어갈 수 있는 Collection Framework지만, 저장한 데이터를 꺼내어 사용할 때 오류가 날 가능성이 많은 것.
(=어떤 타입의 데이터가 들어갔는지, 제대로 된 데이터가 들어갔는지 확인하기 어려움)- generic <T> = type, <E> = element 의미
add(E e)
: 원소 추가remove(Object o)
: 원소 삭제clear()
: 모든 원소 삭제size()
: Collection의 길이 반환contains(Object o)
: 원소 o가 존재하는지 확인containsAll(Collection<?> c)
: c 객체의 모든 원소가 이 객체에도 존재하는지 확인removeAll(Collection<?> c)
: c 객체의 원소와 일치하는 원소를 모두 제거 (this - c; 차집합)retainAll(Collection<?> c)
: c 객체의 원소와 일치하는 원소만 남김 (this ∩ c; 교집합)toArray(T[] a)
: Collection To Arrayimport java.util.*;
class CollectionEx2 {
public static void main(String[] args) {
/*
- 객체만 다룬다
- 가변길이다.
*/
Collection<String> col = new HashSet<String>();
col.add("아반떼");
col.add("그랜저");
col.add("소나타");
col.add("캐스퍼");
System.out.println(col.size());
col.add("펠리세이드");
System.out.println(col.size());
// col.clear();
// System.out.println(col.contains("소나타"));
col.remove("그랜저");
System.out.println(col);
// 넣은 순서 관계없이 출력
// Collection은 순서 없음 = index 없음
// 배열로 문제없는 상황이라면 배열을 사용하는 것이 좋다(간단한 기능 = 덜 복잡한 코드와 더 빠른 속도)
// 처음에는 Collection을 쓰더라도 길이가 확정되면 배열로 바꾸기
// 1번 방법 - 형변환 필요, 사용 불편, 잘 쓰지 않음
Object[] arr1 = col.toArray();
// 2번 방법 - 만들 배열의 형태를 알려줌, 길이는 더 작을 경우 알아서 맞춰줌 = 0 대입
String[] arr2 = col.toArray(new String[0]);
// 3번 방법 - 콜렉션의 사이즈를 가져와서 대입
String[] arr3 = col.toArray(new String[col.size()]);
}
}
import java.util.*;
class CollectionEx4 {
public static void main(String[] args) {
Collection<String> colA = new ArrayList<String>();
colA.add("banana");
colA.add("grape");
colA.add("orange");
colA.add("mango");
colA.add("apple");
Collection<String> colB = new ArrayList<String>();
colB.add("grape");
colB.add("kiwi");
colB.add("lemon");
colB.add("orange");
// System.out.println(colA.containsAll(colB));
// colA.removeAll(colB);
colA.retainAll(colB);
System.out.println(colA);
}
}
Iterator<String> itr = col.iterator();
while(itr.hasNext()) {
String element = itr.next();
System.out.println(element);
}
hasNext()
: 다음 값이 존재하는지 확인 (return : boolean)next()
: 다음 값을 꺼냄 (return : <E>)for(String element : col) { System.out.println(element); }
- 기존에 배운 for each문도 사실 iterator 방식을 사용하고 있다.
for each문이 index를 사용하지 않는다는 것이 바로 이 의미이다.- iterator : 전체 / for each문: 1.5 이후 사용 가능
💘 호기심 탐구
Iterator<String> itr = col.iterator(); while(itr.hasNext()) { String element = itr.next(); System.out.println(element); } while(itr.hasNext()) { String element = itr.next(); System.out.println(element); }
- 여기서 두 번째 while문은 출력되지 않는다.
- 한 번 사용된 Iterator 객체가 재사용되지 않는 것을 보아,
Collection 객체의 원소에 접근할 수 있게 도와주는 방식이 아니라,
Collection 객체의 원소를 Iterator 객체에 담아 사용하는 방식이라고 추측할 수 있다.
add(int x, <E> element)
: x 위치(index)에 원소 추가remove(int x)
: x 위치(index)에 있는 원소 제거get(int x)
: x 위치(index)에 있는 원소 반환set(int x, <E> element)
: x 위치(index)에 있는 원소 변경indexOf(Object o)
: list에서 key값 찾아 index 반환, 없으면 -1 반환indexOf(Object o, int x)
: indexOf(Object o)
에 시작점 x 추가subList(시작점, 끝점)
: list의 subList 생성시작점
부터 끝점-1
까지, 잊지 말자!)import java.util.*;
class ListEx3 {
public static void main(String[] args) {
Vector<String> list = new Vector<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.add("g");
List<String> subList = list.subList(1, 5);
System.out.println("list : " + list);
System.out.println("subList : " + subList);
// list.add("some");
subList.add("x");
System.out.println("list : " + list);
System.out.println("subList : " + subList);
Vector<String> newList = new Vector<String>(subList);
newList.add("z");
System.out.println("list : " + list);
System.out.println("subList : " + subList);
System.out.println("newList : " + newList);
}
}
Vector<String> newList = new Vector<String>(subList);
Arrays.asList(배열)
을 이용해 list로 변경List<String> list = Arrays.asList(arr);
import java.util.*;
class ListEx4 {
public static void main(String[] args) {
// 배열 -> List
String[] arr = {"some", "any", "other", "another"};
// fixed-size
List<String> list = Arrays.asList(arr);
System.out.println(list);
//System.out.println(list.get(1));
// list.add("java");
ArrayList<String> myList = new ArrayList<String>(list);
myList.add("java");
System.out.println(myList);
}
}
Collections.sort(list)
: list 정렬Collections.max(list)
: list 최대값 반환 (정렬 필수)Collections.min(list)
: list 최소값 반환 (정렬 필수)import java.util.*;
class SetEx1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("a");
list.add("a");
list.add("a");
list.add("a");
HashSet<String> set = new HashSet<String>();
set.add("a");
set.add("a");
set.add("a");
set.add("a");
set.add("a");
System.out.println(list);
System.out.println(set);
// ex) 놀이공원 입장객 중 재입장한 사람들을 제외하고 순수 입장객 수만 계산
}
}
List vs. Array
출처