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("입력하신 아이디가 존재하지 않습니다.");
}
}
}