Java

Java Collection Framework (JCF) / Collection (List - ArrayList, Vector, Stack / Set / Map)

소댓 2023. 3. 23. 18:48

* Java Collection Framework(JCF)

: 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합

  데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것

 

* Collection

- List : 순서가 존재, 중복 가능

- Set : 순서가 X, 중복 X

- Map : key <==> value 매핑, key는 유니크한 값, value : 중복 가능

 

 

[ List ] 

 

> ArrayList : 비동기화, java에서 벡터보다 속도가 빠름, Object에 담고 한계가 없음
> Vector : 동기화, 성장형 Object 배열을 구현해놓은 클래스로 데이터 크기 증가가능, 기본적으로 비어있는 10칸짜리
> Stack : 선입후출(First-In Last-Out), 후입선출(Last-In First-Out), 담긴 데이터를 꺼내면(pop) 사라짐

--> 가장 많이 사용하는 건 ArrayList! (Vector와 ArrayList는 비슷하지만 ArrayList가 더 빨라서 많이 쓰임)

 

 

* ArrayList  : add, size, get

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package day16;
 
import java.util.ArrayList;
 
public class ArrayListEx1 {
    public static void main(String[] args) {
        
        
        ArrayList list = new ArrayList();
        
        list.add("딸기");
        list.add("포도");
        list.add("귤");
        list.add("사과");
        list.add("바나나");
        list.add("배");
        list.add("키위");
        
        System.out.println("list : "+list);
        System.out.println("총 데이터 수 : "+list.size());
        
        list.add("딸기");
        list.add("딸기");
        list.add("딸기");
        list.add("딸기");
        list.add("딸기");
        list.add("딸기");
        list.add("딸기");
        list.add("딸기");
        
        
        System.out.println("list : "+list);
        System.out.println("총 데이터 수 : "+list.size());
        
        // 데이터 찾기
        boolean flag = list.contains("수박");
        System.out.println("수박이 있니? "+flag);
        
        list.add("수박");
        flag = list.contains("수박");
        System.out.println("수박이 있니? "+flag);
        
        
        // ArrayList 안에 있는 모든 요소를 화면에 출력
        for(int i = 0; i<list.size(); i++) {
            System.out.println(list.get(i));
        }
        
        // Vector와 ArrayList는 비슷..
        // >> ArrayList가 더 빠르기 때문에 ArrayList 쓰는 게 더 좋음!
        
    }
}
 
cs

 

 

 

* Vector : add, capacity, size, get

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package day16;
 
import java.util.Vector;
 
// Java Collection Framework(JCF)
// 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
// 데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
 
 
public class VectorEx1 {
    public static void main(String[] args) {
        
        int[] m = new int[3];
        
        System.out.println(m.length);
        
        Vector v = new Vector();
        
        // v.add(Object); : 배열 안에 데이터 담기
        v.add("딸기");
        v.add("포도");
        v.add("사과");
        v.add("배");
        v.add("수박");
        
        System.out.println("v : "+v);
        System.out.println(v.capacity()); // 내부에서 처리할 수 있는 크기
        System.out.println("총 데이터 수 : "+v.size());
        
        // string 데이터를 어떻게 넣는거지?
        String fruit = "두리안";
        System.out.println(fruit.substring(01)); // string은 substring 가능
        Object obj = fruit; // Parent  = new Child(); : 부모자식 관계이기 때문에
        
        // 두리안 추가
        v.add(obj);
    
        System.out.println("v : "+v);
        System.out.println(v.capacity()); // 내부에서 처리할 수 있는 최대 수용량
        System.out.println("총 데이터 수 : "+v.size()); // 현제 데이터 크기
        System.out.println("---------------------");
        
        v.add("수박");
        v.add("배");
        v.add("수박");
        v.add("배");
        v.add("수박");
        v.add("배");
        v.add("수박");
        v.add("배");
        
        System.out.println("v : "+v);
        System.out.println(v.capacity()); // 10개 넘으면, 자동으로 갯수 증가
        System.out.println("총 데이터 수 : "+v.size());
        
        System.out.println("------------------------");
        
        // 첫번째 과일을 꺼내서 화면에 출려
        
        Object obj2 = v.get(0);
        System.out.println("obj2 : "+obj2);
        System.out.println("obj2 : "+obj2.toString()); // 왜 딸기가 출력?
        // 부모 클래스의 개체를 가져와서 출력
        
        // 이름의 첫 글자만 화면에 출력
//        System.out.println(obj2.substring(0, 1)); // 불가
        
        String f = (String)obj2; // 형변환해야 참조값 전달 가능
        System.out.println(f.substring(01));
        
        System.out.println("----------------------");
        
        // 한 개씩 꺼내서 출력
        for(int i=0; i<v.size(); i++) {
            System.out.println(v.get(i));
        }
        System.out.println("-------------------------");
        
        // 마지막부터 1개씩 출력
        for(int i = v.size()-1; i>=0; i--) {
            System.out.println(v.get(i));
        }
        
        
    }
}
cs

 

 

 

* Stack : push, pop, get

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package day16;
 
import java.util.Stack;
 
public class StackEx1 {
    public static void main(String[] args) {
        
        // Stack 구현해 놓은 클래스 : 후입선출(LIFO), 선입후출(FILO)
        
        Stack s = new Stack();
        
        s.push("딸기");
        s.push("수박");
        
        System.out.println("s : "+s);
        
        s.push("배");
        s.push("포도");
        s.push("사과");
        s.push("배");
        
        System.out.println("s : "+s);
        
        Object obj = s.pop();
        System.out.println(obj);
        
        System.out.println("s : "+s);
        System.out.println("-----------------------");
        
        
        // Vector의 자손 : Stack
        // 벡터 같은 방법으로 꺼내기 가능 
        // > but, get은 꺼내긴 하지만 없애지는 않음 (pop은 삭제)
        Object obj2 = s.get(0);
        System.out.println(obj2);
        
        System.out.println("s : "+s);
        System.out.println("-----------------------");
        
    }
}
 
cs

 

 

 

 

[ Set ] 

 

 

* HashSet : add, iterator, hasNext(), next

: Hash테이블을 이용해서 구현한 클래스, Set 인터페이스를 구현한 클래스(순서가 없음, 중복없음)

  중복된 값을 허용하지 않는다. 순서가 존재하지 않는다. => 변수명.get(0) 불가

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package day16;
 
import java.util.HashSet;
import java.util.Iterator;
 
public class HashSetEx1 {
 
    public static void main(String[] args) {
        
        HashSet hs = new HashSet();
        
        hs.add("딸기");
        hs.add("바나나");
        hs.add("포도");
        hs.add("딸기");
        hs.add("딸기");
        hs.add("딸기");
        
        System.out.println("hs : "+hs);
        
        // 중복된 값을 허용하지 않는다.
        // hs.get(0); 불가 > 순서가 존재하지 않는다.
        
        // 값을 꺼내려면..
        Iterator it = hs.iterator();
 
        // for문 쓰면 길이를 선정하기 애매함.. 따라서, while
        while(it.hasNext()) { // hasNext : 다음 값을 가지고 있는지 true/false
            Object obj1 = it.next();
            System.out.println(obj1);
        }
    }
}
 
cs

 

 

 

* HashSet : arrays, iterator, random, Arrays.toString > 배열

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package day16;
 
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
 
public class HashSetEx2 {
    public static void main(String[] args) {
        
        // 정수 배열 6자리
        int[] m = new int[6];
        
        // 1부터 45 사이의 정수를 생성
        Random rnd = new Random();
        
        HashSet hs = new HashSet();
        
        // Hash는 중복된 값을 허용하지 않기 때문에, 중복되면 값이 사라짐
        // 따라서, 중복된 값은 몽땅 제거된 6개의 번호를 얻으려면?
//        hs.add(rnd.nextInt(45)+1);
//        hs.add(rnd.nextInt(45)+1);
//        hs.add(rnd.nextInt(45)+1);
//        hs.add(rnd.nextInt(45)+1);
//        hs.add(rnd.nextInt(45)+1);
//        hs.add(rnd.nextInt(45)+1);
        
        while(hs.size() < 6) {
            hs.add(rnd.nextInt(45)+1);
        }
        
        // 배열에 담기
        Iterator it = hs.iterator();
        
        for(int i=0; i<m.length; i++) {
            m[i] = (int)it.next();
        }
        Arrays.sort(m);
        
        // 옆으로 출력
        System.out.print(Arrays.toString(m));
        
        
//        for(int i=0; i<m.length; i++) {
//            // 배열에 할당
//            m[i] = rnd.nextInt(45)+1; // 1~45
//            for(int j = 0; j<i; j++) {
//                // 중복된 값을 제거하는 방법은?
//                // 중복되었니? 그럼 다시 뽑아
//                if(m[i] == m[j]) {
//                    i--;
//                    break;
//                }
//            }
//        }
//        
//        // 배열에 있는 요소를 출력
//        System.out.println(Arrays.toString(m));
        
        
    }
 
}
 
cs

 

 

 

[ Map ] 

 

* HashMap : put, get, iterator

  > 키를 가지고 value를 구할 수 있음 (키는 중복 불가, value는 교체 가능)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package day16;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
 
public class HashMapEx1 {
    public static void main(String[] args) {
        
        HashMap hm = new HashMap();
        
        // hm.put(key,  value);
        
        hm.put("귤""제주");
        hm.put("사과""대구");
        hm.put("바나나""필리핀");
        hm.put("두리안""말레이시아");
        
        System.out.println("hm : "+hm);
        
        hm.put("바나나""제주");
        System.out.println("hm : "+hm);
        // 키는 중복될 수 없다. (value만 교체)
        
        hm.put("수박""태국");
        hm.put("망고""태국");
        
        System.out.println("hm : "+hm);
        // value는 중복 가능
        
        // 꺼낼 때 get > object로 받음
        Object obj = hm.get("수박"); // 키를 가지고 value를 구함
        System.out.println("수박 : "+obj);
        System.out.println("---------------------------");
        
        Set set = hm.keySet(); // 키값들만 set타입으로 리턴
        System.out.println("set : "+set);
        
        // 하나씩 꺼내려면 Iterator 객체로 만들어서..
        Iterator it = set.iterator();
        // 하나씩 꺼내기
        while(it.hasNext()) {
            Object k = it.next();
            String key = (String)k;
            System.out.println(key + " : "+ hm.get(key)); 
            // 키를 알면 value 값을 꺼내올 수 있음
            
        }
        
    }
}
 
cs