Collections Framework 가 무엇인지 알아보기에 앞서 우리가 익숙한 리스트 배열을 어떻게 사용할 수 있는지 알아보도록 하자
원래 배열은 크기가 지정되어 있다. 그래서 이 크기를 벗어나면 오류가 생길 수 있다.
이 불편함을 컬렉션즈 프레임워크를 사용하면 줄어든다.
선언
ArrayList al = new ArrayList();
add : 추가 하기
al.add("one")
size : 배열의 개수
get : al[1] 대신에 al.get(1)을 사용해야 한다.
for 사용하기
for (int a = 0; i<al.size(); i++ ){
System.out.println(al.get(i)); => "one"
}
value를 따로 변수로 담아서 출력을 해보자
for (int a = 0; i<al.size(); i++ ){
String value = al.get(i); => 에러
System.out.println(value);
}
왜 에러가 날까 ? =>
add 라는 메서드는 어떤 형태의 인자라도 넣을 수 있는데 사실 Object이다(Object가 모든 자료형의 시초이기 떄문)
그래서 al.get(i)
는 Object 형태이기 때문에 이 값을 String으로 형변환을 해줘야한다.
for (int a = 0; i<al.size(); i++ ){
String value = (String)al.get(i);
System.out.println(value);
}
(String)al.get(i)
이렇게 사용하면 안정성이 떨어진다.
그래서 요즘은 제네릭을 이용해서 ArrayList 자체의 형태를 지정한다.
ArrayList<String> al = new ArrayList<String>();
Collections Framework 아래에는 두가지의 카테고리가 있다.
Set (중복 불가)
List
Queue
key,value 가 있는 형식
HashSet<Integer> hs = new HashSet<Integer>();
hs.add(1)
hs.add(1)
hs.add(2)
hs => 1,2
set은 중복 값이 포함이 되지 않는다는 특징이 있다.
set은 집합이라는 의미로 집합과 관련된 메서드들이 있다.
A.containsAll(B)
: B의 모든 값이 A에 포함된다 (부분집합)
A.addAll(B)
: A와 B를 합쳐서 A를 만든다 (합집합)
A.retainAll(B)
: A에도 있고 B에도 있는 값 (교집합)
A.removeAll(B)
: A에서 B를 뺀다 (차집합)
list,set 둘 다 사용 가능
둘 다 Collection 인터페이스를 사용하고 있어서 iterator 를 사용할 수 있다.
반복자 : 컨테이너의 값들을 하나하나 반복하며 작업을 할 수 있게 해준다
Ex)
HashSet<Integer> A = new HashSet<Integer>();
A.add(1);
A.add(2);
A.add(3);
Iterator hi = A.iterator();
while(hi.hasNext()){
Sysout.out.println(hi.next());
}
Iterator 는 반복자로 A를 복사해왔다라는 느낌으로 받아드리면 되겠다.
hasNext()
= Iterator의 내용이 있는지 확인next()
=> pop이랑 비슷한 느낌으로 한개를 빼고 return 해준다.key와 value 가 존재하는 형식
key 값은 중복되면 안되고, value는 중복되어도 된다.
Ex)
HashMap<String,Integer> a = new HashMap<String,Integer> ();
a.put("one",1);
a.put("two",2);
a.put("three",3);
System.out.println(a.get("one"));
entrySet
을 이용해서 Map을 Set 형태로 만든다.
Set에 for를 사용하는데 , 여기서도 방법이 특이하기 때문에 주의한다.
Set<Map.Entry<String,Integer>> entries = map.entrySet();
for(Map.Entry<String,Integer> entry:entries){
System.out.println(entry.getKey()+entry.getValue())
}
Set 을 만드는데 Map.Entry
의 클래스 형태이다. 이 클래스 형태는 HashMap을 만들 때와 형식이 같다.
for( something : somethings ){}
getKey()
,getValue()
Collections.sort()
sort는 list 형식의 데이터만 정렬해준다.
하지만 그냥 list에 되는 것이 아니다.
Comparable
인터페이스이 구현된 클래스 형식에서만 사용이 가능하다.
Comparable
는 compareTo 메서드를 구현하게 강제되고 있다.
class Computer implements Comparable{
int serial;
String owner;
public int compareTo(Object o){
return this.serial - ((Computer)o).serial;
}
}
compareTo
의 결과로는 양수 / 0 / 음수가 return 되고 이 값들을 토대로 정렬을 하게 된다.