List: 인덱스 위치에 대해 알고 있는 컬렉셔
Set: 중복된 것을 허용하지 않는 컬렉션
Map: 키-값 기능을 제공하는 컬렉션
1. List - List 인터페이스는 클래스에 인덱스를 제공한다. 인덱스를 사용하면 특정 위치(인덱스)에 있는 아이템을 가져올 수도 있고 특정 위치에 집어 넣을 수도 있고 어떤 위치에 어떤 객체가 있는지 알아 낼 수도 있다. List를 구현하는 클래스에서는 ListIterator를 줄 수도 있다. ListIterator는 그 목록을 앞이나 뒤로 쉽게 움직이게 해 주는 역할을 한다. List를 구현하는 클래스 중에서 아래 몇 가지를 설명한다.
1) ArrayList - 상당히 빠르고 마음대로 키울 수 있는 '초강력 배열'이다.
2) Vector - ArrayList의 구형 버전이다. Vector에 있는 모든 메소드는 동기화되어 있어서 스레드에서 쓸때 안전하긴 하지만 항상 오버헤드가 발생하기 때문에 되도록이면 Vector 대신 ArrayList를 사용하는 것이 좋다. 여기서 이 클래스를 언급하는 이유는 다른 코드에서 Vector가 나오는 경우가 종종 있기 때문이다.
3) LinkedList - ArrayList와 비슷한데 편하게 목록 끝에 원소를 추가하거나 끝에 있는 원소를 제거할 수 있는 메소드가 추가되었다. 전통적으로 LinkedList는 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 많이 사용된다. API문서를 보면 목록 중간의 임의의 위치에 원소를 추가/제거하는 경우에는 LinkedList가 ArrayList보다 약간 빠르다고 나와있다.
2. Set - Set 인터페이스를 이용하면 컬렉션에 중복된 항목이 들어가는 것을 쉽게 예방할 수 있다. Set 인터페이스에서는 각 원소 클래스의 equals() 메소드를 이용하여 새로 입력되는 항목이 중복되어있는지 확인한다. Set을 구현하는 클래스 중에서 아래 몇 가지를 설명한다.
1) HashSet - Set 클래스 가운데 가장 빠른 임의 접근 기능을 제공하지만 그 순서를 전혀 예측할 수 없다.
2) LinkedHashSet - 자바 1.4에서 새로 추가된 클래스다. 추가된 순서대로, 또는 가장 최근에 접근한 순서대로 각 원소를 접근할 수 있다. 두 번째 방법은 가장 최근에 접근된 원소를 관리할 수 있는 캐시를 만드는데 유용하다.
3) TreeSet - 원소를 정렬된 순서대로 보관하는 데 유용한 클래스다. TreeSet에서 원소를 자연스러운 순서(알파벳 순서)로 정렬하도록 설정할 수도 있고 별도의 정렬 방법을 정해서 사용할 수도 있다.
주의, Set이 제대로 작동할 수 있도록 하려면(즉, 중복된 원소가 없도록 하려면) Set에 집어넣는 원소는 equals()를 오버라이드하는 클래스에 속한 원소여야만 한다. 따라서 String이나 래퍼 클래스는 마음놓고 쓸 수 있겠지만 다른 대부분의 클래스에서는 equals()를 오버라이드한 다음에 써야 한다.(물론, hashCode()도 오버라이드해야 한다.) 무엇인가를 Set에 집어 넣으려고 하면 Set에서는 우선 equals() 메소드를 써서 그 안에 들어있는 다른 원소와 겹치지 않는지 비교한다. 그런데 equals()를 오버라이드하지 않는 클래스로 만든 객체에 대해서는 같은 것으로 간주되는 원소가 없기 때문에 문제가 생길 수도 있다.
3. Map - Map 인터페이스는 키와 값을 쉽게 대응시킬 수 있는 기능을 제공한다. 모든 Map 클래스에서는 주어진 키에 해당하는 값을 빠르게 찾아내기 위해 hashCode()와 equals() 메소드를 이용한다. 키와 값은 둘 다 객체여야 하므로 키를 만들어낼 때는 거의 항상 String이나 래퍼 클래스를 사용한다. String과 레퍼 클래스에서는 equals()가 오버라이드되어 있기 때문에 서로 다른 String 객체(또는 같은 클래스 유형에 속하는 서로 다른 래퍼 객체)가 '실질적으로 동일한 경우'에는 equals()에서 true를 리턴하기 때문이다. 직접 만든 객체에서 equals() 메소드를 오버라이드할 때는 hashCode()도 오버라이드해야 한다는 점을 꼭 기억하기 바란다. API 문서를 보면 이와 관련된 내용을 찾을 수 있다.
1) HashMap - 정렬 기능은 제공하지 않지만 Map 클래스 중에서 가장 빠른 임의 접근 기능을 제공한다.
2) Hashtable - HashMap의 구형 버전이기 때문에 될 수 있으면 HashMap을 사용하는 것이 좋다. (Vector와 유사하게 동기화 관련 오버헤드 문제가 발생할 수도 있다.) 직접 코드를 만들 때는 사용하지 않는 것이 좋지만, 다른 코드에서 볼 수도 있기 때문에 어느 정도는 알아두는 것이 좋다.
3) LinkedHashMap - 자바 1.4에서 새로 추가된 클래스로 LinkedHashSet과 비슷하다. 입력된 순서 또는 가장 최근에 접근된 순서대로 보관할 수 있다. 임의 접근면에서 보면 HashMap에 비해 느리다.
4) TreeMap - 원소를 정렬된 상태로 유지하기에 좋다. TreeMap에서 정렬 순서는 알파벳 순서로 할 수도 있고 직접 정렬 규칙을 만들어서 정할 수도 있다. TreeMap에서는 순서대로 접근할 수 있는 정렬된 Collection이나 Set을 리턴하는 entrySet(), keySet(), values()와 같은 메소드를 제공한다.
4. Iterator - 여기에 나와있는 컬렉션 중에서는 Iterator 또는 List Iterator를 제공하는 것이 많다. 이러한 반복자는 컬렉션 클래스의 특정 인스턴스와 연결되어있는 별도의 객체이다. 컬렉션의 각 원소를 돌아다닐 때는 우선 반복자(또는 컬렉션 유형에 따라 목록 반복자)를 리턴하는 메소드를 호출하여 특정 컬렉션에 대한 반복자를 받아야 한다. 그리고 나서 Iterator 또는 ListIterator 클래스에 있는 메소드를 사용해서 컬렉션을 접근할 수 있다.
Head First Java p.632~633
'개발 및 관리 > Java' 카테고리의 다른 글
Calendar, Date (0) | 2013.02.13 |
---|---|
Comparator와 Comparable (0) | 2013.02.13 |
String VS StringBuffer (0) | 2013.02.07 |
equlas() 메소드 오버라이딩 (0) | 2013.02.07 |
Head First Series (0) | 2013.02.05 |