자바

자바의정석 CH 11 컬렉션 프레임웍 - 1

JANNNNNN 2023. 4. 18. 15:52

컬렉션(collection) : 여러 객체(데이터)를 모아 놓은 것을 의미

프레임웍(framework) : 표준화, 정형화된 체계적인 프로그래밍 방식

컬렉션 프레임웍(collections framework) : 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 방식

컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공

컬렉션 클래스(collection class) : 다수의 데이터를 저장할 수 있는 클래스 (ex, Vector, ArrayList, HastSet)

3가지의 인터페이스가 존재한다.

=> List : 순서 O 중복 O ex)대기자 목록

=> Set : 순서 X 중복 X ex)집합. 네발동물의 집합에는 개, 고양이 ,사자 ... 가 있는 것처럼!

=> Map은 아이디와 패스워드 같이 두개의 값을 하나로 묶어 놓은 것이 Map이다. 키는 중복 X 값은 중복을 허용한다.

List와 Set에 공통점을 뽑아서 Collection을 만들었다.

+ 내가 다루려는 객체가 순서가 중요한지, 중복은 있어도 되는지 등을 고려해서 이 3가지의 인터페이스를 고르면 됨

 

Collection 인터페이스의 메서드

Collection 인터페이스의 메서드

=> 추가(add) 검색(contatins) 삭제(remove)가 기본이다.

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

List 인터페이스

Vector과 ArrayList는 거의 비슷한 것인데 ArratList가 New 버전.

=> ArrayListLinkedList가 핵심

=> 추가 add, 읽기 get, 변경 set, 삭제 remove, 검색 indecOf(왼->오 방향), lastindexOf(오->왼 방향)

Collection 인터페이스의 메서드는 제외한 것. 

-> List와 Set이 Collection의 자손이기 때문에 Collection의 메서드를 사용할 수 있는 것.

Set(=집합) 인터페이스 순서 X, 중복 X

=>HashSetTreeSet이 핵심이다.(합집합 교집합 구할 때 편리하게 사용 가능)

+Set인터페이스 메서드 - Collection 인터페이스와 동

=> 집합과 관련된 boolean 메서드(Collection에 변화가 있으면 true, 없으면 false를 반환)

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

=>HaspMapTreeMap이 핵심

=> Map에 객체를 추가할 때엔 put을 사용. 검색 - get, contains, 삭제- remove,

읽기 - entrySet() - 키와 값을 한쌍이라고 부르는데 한쌍을 반환, keySet() - 키만 읽어옴=반환, values() - 값만 읽어옴

 

1. List 순서 O 중복 O

1-1 ArrayList (연속적)

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

ArrayList와 달리 Vector는 자체적으로 동기화 처리가 되어 있다.

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

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

=> List 인터페이스를 구현한 대표적인 컬렉션 클래스가 ArrayList와 LinkedList. 

  =>Object[] 에 모든 종류의 객체를 저장할 수 있다.

예제

=> indexOf("1")과 (1)은 다르다. String vs Integer

=>list.remove(1)은 인덱스 주소가 1인 객체를 삭제하는 것

    list.remove(new Integer(1));은 값에 있는 숫자 1을 삭제하는 것

=> list2에서 list값이 포함되어 있다면 중복값을 삭제하는 for문.

list2.get(i)값에 0이 들어간다면 0번 인덱스 값이 list1에 포함되어있을 때 true면 list2.remove(0)번째 값을 지운다.

ArrayList에 지정된 객체의 삭제과정

=> 맨 마지막 4를 삭제하지 않는 이상 중간의 값을 삭제하기 위해선 하나씩 위로 복사해서 

삭제할 데이터를 덮어쓰고 마지막 데이터의 개수가 삭제된다. (이런식으로 ArrayList의 remove가 이루어진다)

=>remove했다고 해서 그 부분이 뻥 뚫리는 것이 아니라 위로 한칸씩 옮겨가는 것.

=>맨 마지막 값을 삭제하는 경우(list.size()-1)는 배열 복사가 없으며 속도가 빠르다. (끝에서부터 지우는 것이 효과적)

1-2 LinkedList (불연속적)

- 배열의 장점 : 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간(접근 시간, access time)이 짧다.

- 배열의 단점 : 크기를 변경할 수 없다. 변경해야할 땐 새로운 배열을 생성 후 데이터를 복사해야한다.

  크기 변경을 피하기 위해 충분히 큰 배열을 생성하면, 메모리가 낭비된다.

- 배열의 단점 2 : 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다. (자리를 옮겨야하기 때문에)

   그러나 순차적인 데이터 추가(끝에 추가)와 삭제(끝부터 삭제)는 빠르다. (이동이 없기 때문)

 

=> LinkedList배열의 단점(크기변경 안되고, 추가삭제할 떄 시간 오래걸리는 것)을 보완한다.

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

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

=>저 네모를 노드라고 부른다. 

서로 연결되어있기 때문에 불연속적이다. (1번째 노드에서 3번째 노드로 가려면 한칸씩 이동해야함)

=> 링크드 리스트 : 접근성이 나쁘다.

더블리 링크드 리스트 (doubly linked list) - 앞뒤(다음요소,이전요소)로 연결되어 있는 이중 연결리스트, 접근성 향상

더블리 써큘러 링크드 리스트 (doubly cricular linked list) - 이중 원형 연결리스트, 맨 처음과 맨 끝을 한번에 이동 가능

Ex) Tv 채널에서 0번에서 999번으로 바로 이동하는 것처럼.

1-3 ArrayList vs LinkedList - 성능 비교

LinkedList는 객체를 하나하나 생성해야하기 때문에 순차적으로 데이터를 추가하는 데에 오래걸린다.

비순차적으로(중간에 추가하거나 삭제하는 것) 데이터를 추가/삭제하는 것은 LinkedList가 더 빠르다.

접근시간도 바로 접근이 가능한 ArrayList가 더 빠르다.