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(5, 600); //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[]{10, 20,30,40, 50};
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(3, 40);
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 객체들을 반복해서 하나씩 가져오는 코드
'개발 수업 > JAVA' 카테고리의 다른 글
[Java] StringBuffer,ArrayList클래스와 HashSet클래스 비교 (0) | 2023.05.23 |
---|---|
[Java] Object 클래스(equals(),hashCode()) (0) | 2023.05.22 |
[Java] 인터페이스 (0) | 2023.05.20 |
[Java] 인터페이스 예제 (0) | 2023.05.18 |
[Java] 다형성/필드의 다형성,매개 변수의 다형성 (0) | 2023.05.18 |