자바의 정석 Chapter11 컬렉션 프레임 워크

MinJee Lee·2022년 3월 12일
0

Java

목록 보기
4/10
post-thumbnail

😎컬렉션 프레임워크 (Collections Framework)

컬렉션(collection)

여러 객체(Data)를 모아 놓을 것을 의미한다.

프레임워크(framework)

표준화, 정형화된 프로그래밍 방식이다.

컬렉션 프레임워크란

데이터 군(컬렉션)을 저장하는 클래스들을 표준화한 설계

프레임워크는 표준화된 프로그래밍 방식을 의미한다.

Java API 문서에서는 컬렉션 프레임워크를

데이터 군(group)을 다루고 표현하기 위한 단일화된 구조

자바의 컬렉션 프레임워크는 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공한다.

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

List

순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.

ex) 1.김현수

2.홍길동

3.김천수

4.홍길동

Set

순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.

ex) 네발동물 → 개, 고양이, 사자, 호랑이

Map

키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합

ex) 02 서울, 031 경기

ex) id pw

순서는 중요하지 않음 누가 먼저 가입했는지 중요하지 않음

List 인터페이스

List 인터페이스는 중복을 허용하면서 저장 순서가 유지 되는 컬렉션을 구현하는 데 사용한다.

Set 인터페이스

Set 인터페이스는 중복을 허용하지 않고 저장순서가 유지 되지 않는 컬렉션 클래스를 구현 하는 데 사용된다.

→ 합집합, 차집합, 교집합 구현할때 boolean 들어간 Method 유용

Map 인터페이스

Map 인터페이스는 key와 value를 하나의 쌍으로 묶어서 저장하는 컬렉션을 구현하는 데 사용된다.

Map.Entry 인터페이스

Map에 저장되는 key-value쌍으로 다루기 위해 내부적으로 Entry인터페이스를 정의했다.

🤔1.2 ArrayList

ArrayList는 기존 Vector를 개선한 것으로 구현 원리와 기능적인 측면에서 동일하다.

Vector → 동기화 0

ArrayList → 동기화 x

List 인터페이스를 구현하여 저장 순서 유지, 중복허용, Data 저장 공간 배열사용한다.

ArrayList는 Object 배열을 이용해서 데이터를 순차적으로 저장한다.

배열에 더 이상 저장 할 공간이 없으면 보다 큰 배열을 생성해서 기존 배열에 저장도니 내용을 새로운 배열로 복사한 다음에 저장한다.

class ArrayListEx1{ 
public static void main(String[] args) {

// 기본 길이(용량, capacity)가 10인 ArrayList를 생성*

ArrayList list1 = new ArrayList(10);

// 원래 ArrayList에는 객체만 저장 가능

// 컴파일러가 auto boxing에 의해 기본형을 참조형으로 자동 casting 됨

// list1.add(5) ---> list1.add(new Integer(5))

list1.add(new Integer(5)); 
list1.add(new Integer(4)); //add로 추가
list1.add(new Integer(2)); 
list1.add(new Integer(0)); 
list1.add(new Integer(1)); 
list1.add(new Integer(3));

//ArrayList(Collection c) 생성자를 이용해서 또 다른 ArrayList생성

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

// Collection은 interface, Collections는 Util.class

Collections.sort(list1); // list1과 list2를 오름차순으로 정렬(sort)한다.*

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에 포함된 객체들을 삭제한다.

/*
1) get(i)로 list2에서 하나씩 꺼낸다. 
2) contains()로 꺼낸 객체가 list1에 있는지 확인 
3) remove(i)로 해당 객체를 list2에서 삭제 */

for(int i= list2.size()-1; i >= 0; i--) { 
				if(list1.contains(list2.get(i))) 
									list2.remove(i);

// 인덱스가 i인 객체를 삭제한다.

// list2.remove(new Integer(1)); // 내용이 1인 것을 삭제 (삭제할 때 조심하자!)

} print(list1, list2); }

static void print(ArrayList list1, ArrayList list2) { 
System.out.println("list1:"+list1); System.out.println("list2:"+list2); 
System.out.println(); 
  } 
}
  • ArrayList에 저장된 세 번째 데이터(data[2])를 삭제하는 과정.

  • ArrayList에 저장된 객체의 삭제 과정(2/2)

① ArrayList에 저장된 첫 번째 객체 부터 삭제하는 경우 (배열 복사 발생)

② ArrayList에 저장된 마지막 객체 부터 삭제하는 경우 (배열 복사 발생 안함)

🙌2.2 LinkedList

배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이커를 읽어 오는데 걸리는 시간 (접근시간 ,access time)이 가장 빠르다는 장점을 가지고 있다. 제네릭 사용이 가능하며 int 객체화한 wrapper class 사용 가능하다.

장점

데이터 삭제 → 단 한번의 참조변경 만으로 가능

데이터 추가 → 한번의 요소(node) 객체 생성과 두번의 참조 변경만으로 가능

새로운 요소가 그 다음 요소를 참조하도록 변경하기만 하면 되므로 처리속도가 매우 빠르다.

ArrayList는 크기 변경이 불가능 하여 새로운 ArrayList를 생성하여 복사하는 형태로 사용했었다.

또한 추가 삭제하는 번거로움이 있었다.

다만 LinkedList는 그런 불연속적으로 존재하는 데이터를 서로 연결(Link)한 형태로 구성되어 있어 ArrayList 의 단점이 보안되었다.

1) 단일 연결 리스트(Singly Linked List)

  • 이동 방향이 단방향이기 때문에 다음 node에 접근하기 쉽지만 이전요소에 대한 접근은 어렵다.

2) 이중 연결 리스트 (Doubly Linked List)

  • 단순히 링크드 리스트에 참조변수를 하나 더 추가하여 다음 요소 참조 뿐 아니라 이전요소에 대한 참조가 가능하다

3.) 이중 원형 연결 리스트(Doubly Circular Linked List)

  • 단순히 Doubly Circular Linked List의 첫 번째 요소와 마지막 요소를 서로 연결 시킨 것이다.
  • 마치 TV의 마지막 채널에서 채널을 증가시키면 첫 번째 채널로 이동하고 첫번째 채널에서 채널을 감소시키면 마지막 채널로 이동하는 것과 같다.

🔥Array List 와 Linked List의 차이

  1. 순차적으로 추가/ 삭제하는 경우에는 ArrayList가 빠르다.

순차적으로 삭제한 다는 것은 마지막 데이터부터 역순으로 삭제해 나간다는 것을 의미한다.

ArrayList는 마지막 데이터부터 삭제할 경우 각 요소들의 재배치가 필요하지 않기 때문에 상당히 빠르다.

  1. 중간 데이터를 추가/삭제 하는 경우에는 LinkedList가 빠르다.

LinkedList는 각 요소간의 연결만 변경해 주면 되기 때문에 처리 속도가 매우 빠르다.

반면 ArrayList 는 각요소들을 재배치하여 추가할 공간을 확보하거나 빈 공간을 채워야 하기 때문에 처리 속도가 느리다.

이 게시물은 자바의 정석 책을 요약한 내용입니다.

0개의 댓글