
List와 Set는 서로 공통점이 많아 Collection이라는 인터페이로 묶임. 즉, 이 둘의 공통점이 추출되어 추상화된 것이 Collection이라는 인터페이스.
| 기능 | 리턴 타입 | 메소드 | 설명 |
|---|---|---|---|
| 객체 추가 | boolean | add(Object o)/addAll(Collection c) | 주어진 객체 및 컬렉션의 객체들을 컬렉션에 추가함 |
| 객체 검색 | booelan | contains(Object o)/containsAll(Collection c) | 주어진 객체 및 컬렉션이 저장되어 있는지 여부를 리턴 |
| Iterator | ierator() | 컬렉션의 iterator를 리턴 | |
| boolean | equals(Object o) | 컬렉션이 동일한지 여부를 확인 | |
| boolean | isEmpty() | 컬렉션이 비어있는지 여부를 확인 | |
| int | size() | 저장되어 있는 전체 객체 수를 리턴 | |
| 객체 삭제 | void | clear() | 컬렉션에 저장된 모든 객체를 삭제 |
| boolean | remove(Object o)/removeAll(Collection c) | 주어진 객체 및 컬렉션을 삭제하고 성공 여부를 리턴 | |
| boolean | retainAll(Collection c) | 주어진 컬렉션을 제외한 모든 객체를 컬렉션에서 삭제하고, 컬렉션에 변화가 있는지의 여부를 리턴 | |
| 객제 변환 | Object[] | toArray() | 컬렉션에 저장된 객체를 객체배열(Object [])로 반환 |
| Object[] | toArray(object[] a | 주어진 배열에 컬렉션의 객체를 저장해서 반환함 |
| 기능 | 리턴타입 | 메서드 | 설명 |
|---|---|---|---|
| 객체 추가 | void | add(int index, Object element) | 주어진 인덱스에 객체를 추가 |
| boolean | addAll(int index, Collection c) | 주어진 인덱스에 컬렉션을 추가 | |
| Object | set(int index, Object element) | 주어진 위치에 객체를 저장 | |
| 객체 검색 | Object | get(int index) | 주어진 인덱스에 저장된 객체를 반환 |
| int | indexOf(Object o)/lastIndexOf(Object o) | 순방향/역방향으로 탐색하여 주어진 객체의 위치를 반환 | |
| ListIterator | listIterator()/listIterator(int index) | List의 객체를 탐색할 수 있는 ListIterator 반환/ 주어진 index부터 탐색할 수 있는 LastIterator 반환 | |
| List | subList(int fromindex, int toIndex) | fromIndex부터 toIndex에 있는 객체를 반환 | |
| 객체 삭제 | Object | remove(int index) | 주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환 |
| boolean | remove(Object o) | 주어진 객체를 삭제 | |
| 객체 정렬 | void | sort(Comparator c) | 주어진 비교자(comparator)로 List를 정렬 |
List인터페이스를 구현한 클래스로는 ArrayList, Vector, LinkedSet, Stack 등이 있음.


ArrayList에서 데이터를 추가하는 상황을 나타낸 그림.
결론: 데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않는다면 ArrayList를 사용
iterator()를 호출하면, Iterator 타입의 인스턴스가 반환됨| 메서드 | 설명 |
|---|---|
| hasNext() | 읽어올 객체ㅏ 남아있으면 true를 리턴하고, 없으면 false를 리턴함. |
| next() | 컬렉션에서 하나의 객체를 읽어옴. 이 때, next()를 호출하기 전에 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인해야함. |
| remove() | next()를 통해 읽어온 객체를 삭제함. next()를 호출한 다음에 remove()를 호출해야 함 |
ArrayList<String> list = ...;
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){ // 다음 객체가 있다면
String str = iterator.next(); // 객체를 읽어오고,
if(str.equals("str과 같은 단어")){ // 조건에 부합한다면
iterator.remove(); // 해당 객체를 컬렉션에서 제거합니다.
}
}
-Set: 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는 ㅓㅋㄹ렉션
예. HashSet, TreeSet
-Set 인터페이스에 정의된 메서드
| 기능 | 리턴 타입 | 메서드 | 설명 |
|---|---|---|---|
| 객체 추가 | boolean | add(Object o) | 주어진 객체를 추가하고, 성공하면 true를, 중복 객체면 false를 반환 |
| 객체 검색 | boolean | contains(Object o) | 주어진 객체가 Set에 존재하는지 확인 |
| boolean | isEmpty() | Set이 비어있는지 확인 | |
| Iterator | Iterator() | 저장된 객체를 하나씩 읽어오는 반복자를 리턴 | |
| int | size() | 저장되어 있는 전체 객체의 수를 리턴 | |
| 객체 삭제 | void | clear() | Set에 저장되어져 있는 모든 객체를 삭제 |
| boolean | remove(Object o) | 주어진 객체를 삭제 |
add(Object o)를 통해 객체를 저장하고자 함hashCode() 메서드를 통해 얻어냄hashCode() 메서드로 얻어냄add(Object o) 메서드가 true를 리턴함equals() 메서드를 통해 객체를 비교함true가 리턴된다면 중복 객체로 간주되어 Set에 추가되지 않으며 add(Object o)가 false를 리턴함false가 리턴된다면 Set에 객체가 추가되며, add(Object o)메서드가 true를 리턴함import java.util.*;
public class Main {
public static void main(String[] args) {
// HashSet 생성
HashSet<String > languages = new HashSet<String>();
// HashSet에 객체 추가
languages.add("Java");
languages.add("Python");
languages.add("Javascript");
languages.add("C++");
languages.add("Kotlin");
languages.add("Ruby");
languages.add("Java"); // 중복
// 반복자 생성하여 it에 할당
Iterator it = languages.iterator();
// 반복자를 통해 HashSet을 순회하며 각 요소들을 출력
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
입력한 순서대로 출력되지 않고, "Java"를 두 번 추가했지만 한 번만 저장됨.

import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
// TreeSet 생성
TreeSet<String> workers = new TreeSet<>();
// TreeSet에 요소 추가
workers.add("Lee Java");
workers.add("Park Hacker");
workers.add("Kim Coding");
System.out.println(workers);
System.out.println(workers.first());
System.out.println(workers.last());
System.out.println(workers.higher("Lee"));
System.out.println(workers.subSet("Kim", "Park"));
}
}
요소를 추가하기만 했음에도 불구하고, 자동으로 사전 편찬 순에 따라 오름차순으로 정렬되었음. -> TreeSet의 기본 정렬 방식이 오름차순이기 떄문.

| 기능 | 리턴 타입 | 메서드 | 설명 |
|---|---|---|---|
| 객체 추가 | Object | put(Object key, Obejct value) | 주어진 키로 값을 저장함. 해당 키가 새로운 키일 경우 null을 리턴, 동일한 키가 있을 경우에는 기존의 값을 대체하고 대체되기 이전의 값을 리턴함 |
| 객체 검색 | boolean | containsKey(Object key) | 주어진 키가 있으면 true, 없으면 false를 리턴 |
| boolean | containsValue(Object value) | 주어진 값이 있으면 true, 없으면 false를 리턴 | |
| Set | entrySet() | 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴 | |
| Object | get(Object key) | 주어진 키에 해당하는 값을 리턴 | |
| boolean | isEmpty() | 컬렉션이 비어 있는지 확인 | |
| Set | keySet() | 모든 키를 Set 객체에 담아서 리턴 | |
| int | size() | 저장된 모든 값을 Collection에 담아서 리턴 | |
| Collection | values() | 저장된 모든 값을 Collection에 담아서 리턴 | |
| 객체 삭제 | void | clear() | 모든 Map.Entry(키와 값)을 삭제 |
| Object | remove(Object key) | 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴 |

| 리턴 타입 | 메서드 | 설명 |
|---|---|---|
| boolean | equals(Object o) | 동일한 Entry 객체인지 비교 |
| Object | getKey() | Entry객체의 Key객체를 반환 |
| Object | getValue() | Entry 객체의 Value 객체를 반환 |
| int | hashCode() | Entry객체의 해시코드를 반환 |
| Object | setValue(Object value) | Entry 객체의 Value 객체를 인자로 전달한 value객체로 바꿈 |
HashMap을 생성할 때에는 키와 값의 타입을 따로 지정해주어야 함.
HashMap<String, Integer> hashmap = new HashMap<>();
iterator()를 직접 호출할 수 없음. 그 대신 keySet()이나 entrySet() 메서드를 이용해 Set형태로 반환된 컬렉션에 iterator()를 호출하여 반복자를 만든 후 반복자를 통해 순회할 수 있음.Hashtable은 HashMap과 내부구조가 동일하며 사용 방법 또한 매우 유사. HashMap이 Hashtable의 새로운 버전.
import java.util.*;
public class HashtableExample {
public static void main(String[] args){
Hashtable<String, String> map = new Hashtable<String, String>();
map.put("Spring", "345");
map.put("Summer", "678");
map.put("Fall", "91011");
map.put("Winter", "1212");
System.out.println(map);
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("아이디와 비밀번호를 입력해 주세요");
System.out.println("아이디");
String id = scanner.nextLine();
System.out.println("비밀번호");
String password = scanner.nextLine();
if (map.containsKey(id)) {
if (map.get(id).equals(password)) {
System.out.println("로그인 되었습니다.");
break;
}
else System.out.println("비밀번호가 일치하지 않습니다. ");
}
else System.out.println("입력하신 아이디가 존재하지 않습니다.");
}
}
}
