- Set (집합의 느낌으로 생각)
Set는 중복되는 값은 새 배열에 추가되지 않는다. 데이터의 순서가 보장되지 않음.
- List
추가하는 모든 값이 새 배열에 들어간다. 순서대로 데이터가 들어감.
import java.util.HashSet;
import java.util.Iterator;
public class SetDemo {
public static void main(String[] args) {
HashSet<Integer> A = new HashSet<Integer>();
A.add(1);
A.add(2);
A.add(3);
HashSet<Integer> B = new HashSet<Integer>();
B.add(3);
B.add(4);
B.add(5);
HashSet<Integer> C = new HashSet<Integer>();
C.add(1);
C.add(2);
System.out.println(A.containsAll(B)); // false
System.out.println(A.containsAll(C)); // true
// A.addAll(B); // A와 B의 합집합, A에 1 2 3 4 5 가 들어가게 됨.
// A.retainAll(B); // A와 B의 교집합, A에 3만 남게 됨.
// A.removeAll(B); // A에서 B를 뺀 차집합, A에 1 2 가 남게 됨.
Iterator hi = A.iterator();
while(hi.hasNext()) {
System.out.println(hi.next());
}
}
}
iterator 메소드는 데이터를 꺼내기 위한 Iterator라는 데이터 타입의 객체(인터페이스)를 리턴한다.
Iterator 라는 인터페이스는 hasNext와 next 라는 메소드를 갖고 있음.
hasNext 메소드는 꺼낼 것이 있으면 true, 없으면 false를 리턴함.
next 메소드는 하나를 꺼내면 자동으로 다음것을 참조함.
Collection 인터페이스를 구현하는 클래스와 인터페이스는 모두 iterator 메소드를 가지고 있음.
- Map (Collection을 구현하고 있지 않음)
Map은 key와 value값을 갖는데, key값은 중복이 안 되지만 value값은 중복이 됨.
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
HashMap<String, Integer> a = new HashMap<String, Integer>();
a.put("one", 1);
a.put("two", 2);
a.put("three", 3);
a.put("four", 4);
System.out.println(a.get("one"));
System.out.println(a.get("two"));
System.out.println(a.get("three"));
iteratorUsingForEach(a);
iteratorUsingIterator(a);
}
static void iteratorUsingForEach(HashMap<String, Integer> map) {
Set<Map.Entry<String, Integer>> entries = map.entrySet();
// entrySet 메소드를 통해 map 안의 값이 Set 타입의 entries로 들어감.
for (Map.Entry<String, Integer> entry : entries) {
// entries에 담긴 값이 entry로 들어가게 됨
System.out.println(entry.getKey() + " : " + entry.getValue());
// entry에 있는 key값과 value 값이 getKey와 getValue를 통해 각각 나오게 됨.
}
}
static void iteratorUsingIterator(HashMap<String, Integer> map) {
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> i = entries.iterator();
while(i.hasNext()) {
Map.Entry<String, Integer> entry = i.next();
System.out.println(entry.getKey()+" : "+entry.getValue());
}
}
}
put이라는 메소드는 Map 인터페이스에만 존재함.
제네릭에서 앞에 있는 인자 String은 key를 의미하고 뒤의 Integer는 value를 의미함.
get메소드에 key 값을 입력해서 value 값을 리턴할 수 있음.
iteratorUsingForEach 와 iteratorUsingIterator 는 각각 For each문과 Iterator를 이용해서 Hash맵의 Key와 Value를 조회하는 메소드이다.
Map.Entry 라는 인터페이스에는 getKey와 getValue라는 중요한 메소드가 있음.
- Collections와 정렬
import java.util.*;
class Computer implements Comparable{
int serial;
String owner;
Computer(int serial, String owner){
this.serial = serial;
this.owner = owner;
}
public int compareTo(Object o) {
return this.serial - ((Computer)o).serial;
}
public String toString(){
return serial+" "+owner;
}
}
public class CollectionsDemo {
public static void main(String[] args) {
List<Computer> computers = new ArrayList<Computer>();
computers.add(new Computer(500, "egoing"));
computers.add(new Computer(200, "leezche"));
computers.add(new Computer(3233, "graphittie"));
Iterator i = computers.iterator();
System.out.println("before");
while(i.hasNext()){
System.out.println(i.next());
}
Collections.sort(computers);
System.out.println("\nafter");
i = computers.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
}
}
Collections라는 클래스는 sort라는 메소드가 있는데, list 데이터 타입을 정렬해준다.
그 list의 각각의 객체들은 Comparable 이라는 인터페이스를 implements 하고 있어야 sort를 할 수 있다.
그런데 Comparable은 compareTo라는 메소드를 구현하도록 강제하는 인터페이스이다.
그러므로 조건을 준수하기 위해 compareTo를 구현해야 한다는 점을 알아두어야 한다.
위의 코드에서 메소드 sort를 실행하면 내부적으로 compareTo를 실행하고 그 결과에 따라서 객체의 선후 관계를 판별하여 데이터가 정렬이 된다.
여러번 보고, 여러번 쳐보면서 익숙해지기
'Java > Java의 정석' 카테고리의 다른 글
220225 Java - IO (0) | 2022.02.25 |
---|---|
220224 Java - Date, Calendar, time패키지 (0) | 2022.02.24 |
220222 Java - 참조, 제네릭+Collections framework (0) | 2022.02.23 |
220221 Java - 중급 및 복습 (0) | 2022.02.21 |
220220 Java - 중급 (0) | 2022.02.20 |