본문 바로가기
개발 수업/JAVA

[Java] 컬렉션 프레임워크/List 컬렉션(Vector,ArrayList,LinkedList),Set컬렉션(HashSet)

by 오늘 하루s 2023. 5. 22.
728x90
더보기

Day17-1. 230522

컬렉션 프레임워크

 배열은 선언 시 정한 크기(저장 용량)를 변경할 수 없고, 항목을 저장, 삭제, 추가하는 메소드가 없기 때문에 직접 인덱스를 사용해야 한다. 이러한 불편함을 해결하기 위해 자바는 컬렉션 프레임워크를 제공한다.

 

컬렉션 프레임워크란? 

객체들을 효율적으로 추가,삭제,검색 할 수 있도록 인터페이스와 구현 클래스를 java.util패키지에서 제공하는 것.

- 컬렉션 : 객체의 저장

- 프레임워크 : 사용 방법을 정해놓은 라이브러리를 말함.

 

  • 컬렉션 프레임워크의 주요 인터페이스

 

 

List 컬렉션

- 배열과 비슷하게 인덱스로 관리

- 배열과의 차이점은 저장 용량이 자동으로 증가, 객체를 저장할 때 자동으로 인덱스가 부여됨.

- 추가, 삭제, 검색을 위한 다양한 메소드들이 제공됨.

- 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조함.

- 중복해서 객체 저장 가능

 

  • List 컬렉션의 주요 메소드

- Set컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없음

대신, 전체 객체를 대상을 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공.

 

Vector

- 스레드 동기화

: 복수의 스레드가 동시에 Vector에 접근해 객체들 추가, 삭제하더라도 스레드에 안전.

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
package Chap13;
 
import java.util.Vector;
 
public class ArrayVector {
 
    public static void main(String[] args) {
        
        //인터페이스 참조변수 = new 구현클래스();
        //List list = new Vector(); //다형성을 구현
        Vector vector = new Vector(); //Vector객체를 생성,다형성을 구현x
        vector.add(10);
        vector.add(20);
        vector.add(30);
        vector.add(40);
        vector.add(50);
        System.out.println("vector.size()="+vector.size());
        for(int i=0;i<vector.size();i++) {
            System.out.println(vector.get(i));
        }
        vector.add(5,60); //index가 5인 위치에 value 60을 추가/배열 건너띄기는 안됨.
        System.out.println(vector.get(5)); //60
        vector.set(5600); //index가 5인 위치의 요소를 600으로 변경
        System.out.println(vector.get(5)); //600
        System.out.println(vector.contains(600)); //600포함여부 true
 
        System.out.println(vector.remove(5)); // index가 5인 요소 600삭제함.
        vector.clear(); //모든 요소를 삭제
        System.out.println("clear()후의 개수="+vector.size()); //0
        
        System.out.println("--------------------");
        System.out.println();
        
        //배열은 다양한 타입을 넣지 못함.
        int[] arr1 = new int[]{1020,30,4050};
        for(int i=0;i<arr1.length;i++) {
            System.out.println(arr1[i]);
        }
        System.out.println();
        //arr1[5] =60; //runtime 에러발생
        
        //향상된 for문
        for(int value : arr1) {
            System.out.println(value);
        }
    }
}
cs

더보기

* 실행 결과

 

vector.size()=5
10
20
30
40
50
60
600
true
600
clear()후의 개수=0
--------------------

10
20
30
40
50

10
20
30
40
50

ArrayList

- 초기 용량 : 10

- 저장 용량 초과한 객체들이 들어오면 자동적으로 늘어남. 고정도 가능

- 객체 제거 : 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐.

 

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
package Chap13;
 
import java.util.ArrayList;
 
public class ArrayList {
    public static void main(String[] args) {
        ArrayList list= new ArrayList();
        
        list.add(1);
        list.add(2.1234); //타입이 달라도 됨.
        list.add(1); //중복값허용
        //size 확인
        int size = list.size();
        System.out.println("list.size()="+list.size());
 
        //for문 이용 - 값출력
        for(int i=0; i<list.size(); i++) {
            System.out.println(list.get(i));
        }
        
        //특정 index값 지정-값출력
        list.add(3,4); //index가 5인 위치에 value 4 추가
        System.out.println(list.get(3)); 
        
        //특정 index값 변경 후 값출력 확인
        list.set(340);
        System.out.println(list.get(3));
        System.out.println();
        
        //특정 index값 삭제
        list.remove(3);
        //향상된 for문 이용-값출력=>입력한 순서가 유지(되어 출력)
        for(Object value : list) {
            //변수 instanceof 특정클래스타입객체
            if(value instanceof Integer) {
                System.out.println("Integer클래스의 객체야");
                int v = (int)value; //unboxing : 클래스 -> 기본타입
                System.out.println("intv="+v);
            }
            if(value instanceof Long) {
                System.out.println("Long클래스의 객체야");
            }
            if(value instanceof Double) {
                System.out.println("Double클래스의 객체야");
            }
            System.out.println("Object value="+value);
        }
        
        //전부삭제
        list.clear(); //모든 요소를 삭제
        //size확인
        System.out.println("모든 요소 삭제후 개수="+list.size());
    }
}
 
cs

 

더보기

*실행 결과

 

list.size()=3
1
2.1234
1
4
40

Integer클래스의 객체야
intv=1
Object value=1
Double클래스의 객체야
Object value=2.1234
Integer클래스의 객체야
intv=1
Object value=1
모든 요소 삭제후 개수=0

 

LinkedList

- 인접 참조들 링크해서 체인처럼 관리

- 특정 인덱스에서 객체들 제거하거나 추가하게 되면 바로 앞뒤 링크만 변경

- 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package Chap13;
 
import java.util.ArrayList;
import java.util.List;
 
public class ArrayList02 {
 
    public static void main(String[] args) {
        List list = new ArrayList();
    
        list.add("BMW");
        list.add("TESLA");
        list.add("AUDI");
        list.add("HYUNDAI");
        list.add("KIA");
        
        for(Object car : list) {
            System.out.println(car);
        }
    }
 
}
 
cs
더보기

*실행 결과

 

BMW
TESLA
AUDI
HYUNDAI
KIA

 

  • ArrayList와 LinkedList 실행 성능 비교
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
package Chap13;
 
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
 
public class ArrayList02_ex2 {
 
    public static void main(String[] args) {
        List list = new ArrayList();
        List list2 = new LinkedList();
        long st = 0L; //시작시간을 저장하기위한 변수선언 및 초기화
        long et = 0L;
        
        st = System.nanoTime(); //시작시간 구하기
        for(int i=1; i<50000; i++) {
            list.add(i);
        }
        et = System.nanoTime(); //종료시간 구하기
        long runtime = et-st; //시작시간-끝시간=소요시간
        System.out.println("ArrayList소요시간="+runtime);
        
        et = System.nanoTime();
        long runtime2 = et-st;
        System.out.println("LinkedList소요시간="+runtime2);
    }
}
cs
더보기

*실행 결과

 

ArrayList소요시간=3221200
LinkedList소요시간=3465700

-> 끝에서부터(순차적으로) 추가 또는 삭제하는 경우 ArrayList가 빠르지만

중간에 추가,삭제 하는 경우 LinkedList가 더 빠름. 

구분 순차적으로 추가/삭제 중간에 추가/삭제 검색
ArrayList 빠르다 느리다 빠르다
LinkedList 느리다 빠르다 느리다

 

 

Set컬렉션

- 순서유지x, 중복 허용x

  • Set 컬렉션의 주요 메소드

HashSet

- 동일 객체 및 동등 객체는 중복 저장하지 않음.

- 동등 객체 판단 방법

 

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
package Chap13;
 
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
 
public class HashSet {
 
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add("BMW");
        set.add("TESLA");
        set.add("AUDI");
        set.add("HYUNDAI");
        set.add(new String("좋은브랜드차"));
        set.add("KIA");
        System.out.println(set.size());
        set.add("KIA"); //중복 허용x
        System.out.println(set.size());
        
        //for each 사용하여 출력
        System.out.println("----for each사용하여 출력-----");
        for(Object element : set) {
            System.out.println(element); // 출력순서가 유지되지 않는다.
        }
        System.out.println();
        
        //특정객체포함여부 확인"KIA"
        if(set.contains("KIA")) {
            System.out.println("KIA포함되어있으니 삭제할께요");
            //특정객체삭제"KIA"
            set.remove("KIA");
        }else {
        System.out.println("KIA포함x");
        }
        System.out.println(set.size());
        
        //while 전체출력
        System.out.println("----Iterator사용하여 출력-----");
        Iterator iter = set.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next()); 
        }
    }
}
cs
더보기

* 실행 결과

 

6
6
----for each사용하여 출력-----
HYUNDAI
KIA
좋은브랜드차
TESLA
AUDI
BMW

KIA포함되어있으니 삭제할께요
5
----Iterator사용하여 출력-----
HYUNDAI
좋은브랜드차
TESLA
AUDI
BMW

 

  • iterator

- 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것.

- 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용.

Set set = ...;
Iterator iterator = set.iterator();
while(iterator.hasNest()){
  //String객체 하나를 가져옴.
  String str = iterator.next();
}

-> Set 컬렉션에서 String 객체들을 반복해서 하나씩 가져오는 코드

728x90