LostCatBox

Java 배우기 CH11

Word count: 1.2kReading time: 7 min
2022/12/23 Share

컬렉션 프레임웍(collections framework)(!!!)

  • 컬렉션(collection)
    • 여러 객체(데이터)를 모아 놓은 것을 의미
  • 프레임웍(framework)(library+표준화됨)
    • 표준화, 정형화된 체계적인 프로그래밍 방식
  • 컬렉션 프레임웍(collections framework)
    • 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 방식
    • 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공
    • java.util패키지에 포함. JDK1.2부터 사용
  • 컬렉션 클래스(collection class)
    • 다수의 데이터를 저장할 수 있는 클래스
      (예, Vector, ArrayList, HashSet)

컬렉션 프레임웍의 핵심 인터페이스

  • 리스트 = 순서있음, 중복허용
  • 셋 = 순서없음, 중복없음
  • 맵 = 순서없음, 키 중복없음(키-값)

Untitled

Collection 인터페이스의 메서드

  • list, set의 조상이므로 하위 자손들은 모두 쓸수있는 메서드

Untitled

List인터페이스 - 순서O, 중복O

Untitled

List인터페이스 메서드

Untitled

Set인터페이스 - 순서X, 중복X

Untitled

Set 인터페이스의 메서드

Untitled

  • 집합과 관련된 메서드(Collection에 변화가 있으면 true, 아니면 false를 반환)

Untitled

Map인터페이스 - 순서X, 중복(키X, 값O)

  • entry = (키-값) 하나를 부르는 이름

Untitled

Map인터페이스의 메서드

Untitled

list, set, map 자세한 설명

ArrayList

  • ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일

  • ArrayList동기화 처리되어있다(Vector는 안되어있음)

  • List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용

  • 데이터(=객체)의 저장공간으로 배열을 사용한다(배열기반)

  • vector 코드 중 참고할것

Untitled

ArrayList의 메서드

Untitled

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
import java.util.*;

class Ex11_1 {
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
list1.add(new Integer(5));
list1.add(new Integer(4));
list1.add(new Integer(2));
list1.add(new Integer(0));
list1.add(new Integer(1));
list1.add(new Integer(3));

ArrayList list2 = new ArrayList(list1.subList(1,4));
print(list1, list2);

//Collection는 인터페이스, Collections는 유틸클래
Collections.sort(list1); // list1과 list2를 정렬한다.
Collections.sort(list2); // Collections.sort(List l)
print(list1, list2);

System.out.println("list1.containsAll(list2):"
+ list1.containsAll(list2));

list2.add("B");
list2.add("C");
list2.add(3, "A");
print(list1, list2);

list2.set(3, "AA");
print(list1, list2);

// list1에서 list2와 겹치는 부분만 남기고 나머지는 삭제한다.
System.out.println("list1.retainAll(list2):" + list1.retainAll(list2));

print(list1, list2);

// list2에서 list1에 포함된 객체들을 삭제한다.
for(int i= list2.size()-1; i >= 0; i--) {
if(list1.contains(list2.get(i)))
list2.remove(i);
}
print(list1, list2);
} // main의 끝

static void print(ArrayList list1, ArrayList list2) {
System.out.println("list1:"+list1);
System.out.println("list2:"+list2);
System.out.println();
}
} // class
  • list1.remove(new Integer(1))로 해야 배열에서 1값을 삭제함!! (그냥 list1.remove(1)하면, 인덱스 1을 삭제함)

ArrayList에 저장된 객체의 삭제과정

Untitled

배열의 장단점

  • 장점: 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간 짧다. O(1)
  • 단점
    • 단점1: 크기를 변경할수없다(크기를 변경하는 경우 새로운 배열을 생성후 복사해야함
    • 단점2: 비순차적인 데이터의 추가, 삭제에 시간이 많이걸린다.

LinkedList - 위 배열 단점을 보안

  • 배열과 달리 링크드 리스트는 불연속적으로 존재하는 데이터를 연결(link)

Untitled

  • 삽입, 삭제시 단순히 link만 변경하면 빠름

  • 단점: 불연속적이므로 데이터 접근성 나쁨 O(N)

  • 더블리 링크드 리스트 - 이중 연결리스트, 접근성 향상

Untitled

  • 더블리 써큘러 링크드 리스트 - 이중 원형 연결시스트

Untitled

  • 각 장단점 내용( 배열기반 vs연결기반)

Untitled

스택 & 큐

Untitled

스택 메서드

Untitled

큐 메서드

Untitled

기본적으로 참조변수의 클래스는 조상을 쓰는것이좋다. 추후 자손이 바껴도, 자손이 조상을 상속하였다면 변경할 필요없기떄문이다 !!!

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
import java.util.*;

class Ex11_2 {
public static void main(String[] args) {
Stack st = new Stack();
Queue q = new LinkedList(); // Queue인터페이스의 구현체인 LinkedList를 사용

st.push("0");
st.push("1");
st.push("2");

q.offer("0");
q.offer("1");
q.offer("2");

System.out.println("= Stack =");
while(!st.empty()) {
System.out.println(st.pop()); // 스택에서 요소 하나를 꺼내서 출력
}

System.out.println("= Queue =");
while(!q.isEmpty()) {
System.out.println(q.poll()); // 큐에서 요소 하나를 꺼내서 출력
}
}
}

Iterator, ListIterator, Enumeration

  • 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
  • Iterator 사용하기!!
  • ListIterator는 Iterator의 접근성을 향상시킨것(단방향→양방향)

Untitled

Iterator

  • 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한것
  • 구조상관없이 단순히 확인! 후 읽기 만 하면됨!!
    (HashSet(), Arraylist() 등 컬렉션의 자손들은 모두 사용가능)
  • 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
  • 마지막이면 it.hasNext() 는 false반환됨
  • iterator는 1회용이라 다쓰고나오면 새로운 iterator 필요

Untitled

Untitled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.*;

class Ex11_5 {
public static void main(String[] args) {
Collection list = new ArrayList(); //ArrayList는 Collection의 자손!
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");

Iterator it = list.iterator();

while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
} // main
}

Maprhk Iterator

  • Map에는 iterator()가 없다. keySet(), entrySet(), values()를 호출해야 이터레이터 사용가능

Untitled

Arrays

  • 배열을 다루기 편리한 메서드(static) 제공
  • 배열의 출력 - toString()
  • 배열의 복사 - copyOf(), copyOfRange(), 새로운 배열 생성후 반환
  • 배열 채우기 - fill(), setAll()
  • 배열의 정렬과 검색 - sort(), binarySearch()
    binarySearch는 항상 sort가 되어있는 것에만 쓸수있다.
  • 다차원 배열의 출력 - deepToString()
  • 다차원 배열의 비교 - deepEquals()
  • 배열을 List로 변환 - asList(Object …..a),
  • 람다와 스트림 관련 - parallelXXX,spliterator(), stream()

Comparator 와 Comparable

  • 객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스

Untitled

  • sort(대상, 기준) = 기준생략가능한것은 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬

Untitled

  • 직접 Comparator implements받아서 compare 구현가능

Set - 순서X, 중복X

Untitled

  • HashSet
    • Set인터페이스를 구현한 대표적인 컬렉션 클래스
    • 순서를 유지하려면, LinkedHashSet클래스를 사용해야한다
  • TreeSet
    • 범위 검색과 정렬에 유리한 컬렉션 클래스
    • HashSet보다 데이트 추가, 삭제에 시간이 더 걸림

HashSet - 주요 메서드

Untitled

HashSet - 특징

  • HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인
    같은 객체가 없으면 저장하고, 있으면 저장하지 않는다
  • boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
    equals()와 hashCode()가 오버라이딩 되어 있어야함
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
import java.util.*;

class Ex11_11 {
public static void main(String[] args) {
HashSet set = new HashSet();

set.add("abc");
set.add("abc");
set.add(new Person("David",10));
set.add(new Person("David",10));

System.out.println(set);
}
}

class Person {
String name;
int age;

Person(String name, int age) {
this.name = name;
this.age = age;
}

public String toString() {
return name +":"+ age;
}

}
  • 위에 코드는 틀렸다. set에 add가 일어날때 매번 equals를 호출하게되어있지만, 오버라이딩이 되어있지 않아서 다른 값으로 인식하기 때문이다
  • 따라서 아래 코드를 class Person안에 넣어줘야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public int hashCode() {
// int hash(Object... values); // 가변인
return Objects.hash(name, age);
}

@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)) return false;
Person p = (Person)obj;

return name
.equals(p.name) && age==p.age;
}

TreeSet - 범위 탐색, 정렬 우위

  • 이진 탐색 트리로 구현, 범위 탐색과 정렬에 유리
  • 이진 트리는 모든 노드가 최대 2개의 하위 노드를 가짐
  • 이진 탐색 트리는 이진 트리의 한 종류
    • 부모보다 작은 값이 왼쪽 큰 값은 오른쪽에 저장
    • 데이터가 많아질수록 추가, 삭제에 시간이 걸림

Untitled

TreeSet - 데이터 저장과정 boolean add(Object o)

Untitled

TreeSet - 메서드

Untitled

Map 인터페이스

HashMap과 Hashtable - 순서X, 중복(키X,값O)

  • 거의hashmap과 treemap사용
  • HashMap
    • Map인터페이스를 구현한 대표적인 컬렉션 클래스
    • 순서를 유지하려면, LinkedHashMap클래스를 사용하면 된다
  • TreeMap
    • 범위 검색과 정렬에 유리한 컬렉션 클래스
    • HashMap보다 데이터 추가, 삭제에 시간이 더 걸림

Untitled

HashMap의 키와 값

  • 해싱 기법으로 데이터를 저장, 데이터가 많아도 검색이 빠르다
  • Map인터페이스 구현, 데이터를 키와 값의 쌍으로 저장

Untitled

해싱(hashing)
저장할떄, 읽어올때 해시함수를 사용하여, 키값을 넣으면 저장위치(hash code)(배열의index) 알려줌 >> 해시테이블에서 해당 저장위치에 값 찾기가능

  • 배열과 링크드리스트 장점을 모음

    Untitled

  • 해시테이블에 저장된 데이터가져오는 과정

    Untitled

HashMap - 주요 메서드

Untitled

Collections - 컬렉션을 위한 메서드(static)를 제공

  • Objects, Arrays, Collections가 대표적 static메서드 제공
  • 컬렉션 채우기, 복사, 정렬, 검색
    fill(), copy(), sort(), binarySearch()
  • 컬렉션의 동기화
    synchronizedXXX()
  • 변경불가(readOnly) 컬렉션 만들기
    unmodifiableXXX()
  • 싱글톤 컬렉션 만들기 (객체 1개만 저장)
    singletonXXX()
  • 한 종류의 객체만 저장하는 컬렉션 만들기
    checkedXXX()

컬렉션 요약

Untitled

CATALOG
  1. 1. 컬렉션 프레임웍(collections framework)(!!!)
    1. 1.1. 컬렉션 프레임웍의 핵심 인터페이스
    2. 1.2. Collection 인터페이스의 메서드
    3. 1.3. List인터페이스 - 순서O, 중복O
    4. 1.4. List인터페이스 메서드
    5. 1.5. Set인터페이스 - 순서X, 중복X
    6. 1.6. Set 인터페이스의 메서드
    7. 1.7. Map인터페이스 - 순서X, 중복(키X, 값O)
    8. 1.8. Map인터페이스의 메서드
  2. 2. list, set, map 자세한 설명
    1. 2.1. ArrayList
      1. 2.1.1. ArrayList의 메서드
    2. 2.2. ArrayList에 저장된 객체의 삭제과정
    3. 2.3. 배열의 장단점
    4. 2.4. LinkedList - 위 배열 단점을 보안
  3. 3. 스택 & 큐
    1. 3.1. 스택 메서드
    2. 3.2. 큐 메서드
  4. 4. Iterator, ListIterator, Enumeration
    1. 4.1. Iterator
    2. 4.2. Maprhk Iterator
  5. 5. Arrays
  6. 6. Comparator 와 Comparable
  7. 7. Set - 순서X, 중복X
    1. 7.1. HashSet - 주요 메서드
    2. 7.2. HashSet - 특징
    3. 7.3. TreeSet - 범위 탐색, 정렬 우위
      1. 7.3.1. TreeSet - 데이터 저장과정 boolean add(Object o)
      2. 7.3.2. TreeSet - 메서드
  8. 8. Map 인터페이스
    1. 8.1. HashMap과 Hashtable - 순서X, 중복(키X,값O)
    2. 8.2. HashMap의 키와 값
    3. 8.3. HashMap - 주요 메서드
  9. 9. Collections - 컬렉션을 위한 메서드(static)를 제공
  10. 10. 컬렉션 요약