- 자바의 정석 119~126강 ch11 컬렉션 프레임웍(1)2023년 09월 04일 23시 09분 30초에 업로드 된 글입니다.작성자: 민발자728x90
ch 11-1~2 컬렉션 프레임웍
1. 컬렉션
여러 객체(데이터)를 모아 놓은 것을 의미
2. 프레임웍
표준화, 정형화된 체계적인 프로그래밍 방식
생산성과 유지보수성이 좋아짐
3. 컬렉션 프레임웍
컬렉션(다수의 객체)을 다루디 위한 표준화된 프로그래밍 방식
컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공함(저장, 삭제, 검색, 정렬 등)
java.util 패키지에 포함
4. 컬렉션 클래스
다수의 데이터를 저장할 수 있는 클래스(Vector, ArrayList, HashSet)
5. 컬렉션 프레임웍의 핵심 인터페이스
인터페이스 특징 List 순서가 있는 데이터의 집합, 중복 허용
ArrayList, LinkedList, Stack, Vector 등Set 순서를 유지하지 않는 데이터의 집합, 중복 불가
HashSet, TreeSet 등Map 키와 값의 쌍으로 이루어진 데이터의 집합
순서 유지되지 않으며 키는 중복 불가, 값은 중복 허용
HashMap, TreeMap, Hashtable, Properties 등List와 Set의 공통부분을 모아 collection 인터페이스를 정의
ch11-3~6 Collection, List, Set, Map
1. Collection 인터페이스의 메서드
메서드 설명 boolean add(Object o)
boolean addAll(Collection c)지정된 객체 o 또는 Collection c의 객체를 Collection에 추가 void clear() Collection의 모든 객체 삭제 boolean contains(Object o)
boolean containsAll(Collection c)지정된 객체 o 또는 Collection의 객체들이 포함되어 있는지 확인 boolean equals(Object o) 동일한 Collection인지 비교 int hashCode() Collection의 hash code 반환 boolean isEmpty() Collection이 비어있는지 확인 Iterator iterator() Collection의 Iterator를 얻어서 반환 boolean remove(Object o)
boolean removeAll(Collection c)지정된 객체 삭제
지정돈 Collection에 포함된 객체를 삭제boolean retainAll(Collection c) 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제
변화가 있으면 true 없으면 false 반환int size() Collection에 저장된 객체 개수 반환 Object[] toArray() Collection에 저장된 객체를 객체 배열(Object[])로 반환 Object[] toArray(Object[] a) 지정된 배열에 Collection의 객체를 저장해 반환 2. List 인터페이스
순서가 있고 중복을 허용
ArrayList와 LinkedList가 핵심
메서드 설명 void add(int index, Object element)
boolean addAll(int index, Collection c)지정된 index에 element 또는 컬렉션에 포함된 객체 추가 Object get(int index) 지정된 index에 있는 객체 반환 int indexOf(Object o) 지정된 객체의 index를 반환
(List의 첫 번째부터 순방향으로 검색)int lastIndexOf(Object o) 지정된 객체의 index를 반환
(List의 마지막부터 역방향으로 검색)ListIterator listIterator()
ListIterator listIterator(int index)List의 객체에 접근할 수 있는 ListIterator반환 Object remove(int index) index에 있는 객체 삭제하고 삭제된 객체 반환 Object set(int index, Object element) index에 element 저장 void sort(Comparator c) 지정된 비교자Comparatorfh List 정렬 List subList(int formIndex, int toIndex) 지정된 범위에 있는 객체 반환 3. Set 인터페이스
순서 없고 중복 불가
HashSet, TreeSet이 핵심
Set인터페이스의 메서드는 Collection 인터페이스와 동일
집합과 관련된 메서드 → 변화가 있으면 T, 없으면 F 반환
메서드 설명 boolean addAll(Collection c) 합집합, 지정된 객체 c를 추가 boolean containsAll(Collection c) 부분집합, 지정된 객체 c가 포함되어있는지 확인 boolean removeAll(Collection c) 차집합, 지정된 객체 c에 포함된 객체 삭제 boolean reteinAll(Collection c) 교집합, 지정된 객체 c에 포함된 객체만 남기고 삭제 3. Map인터페이스
순서 없고 키는 중복 불가, 값은 중복 가능
HashMap, TreeMap 핵심
LinkedHashMap 순서가 있는 HashMap
메서드 설명 void clear() Map의 모든 객체를 삭제 boolean containsKey(Object key) 지정된 key객체와 일치하는 Map의 key객체가 있는지 확인 boolean containsValue(Object value) 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인 Set entrySet() Map에 저장되어있는 key-value쌍을 Map.Entry타입 객체로 저장한 Set으로 반환 boolean equals(Object o) 동일한 Map인지 비교 Object get(Object key) 지정한 key객체에 대응하는 value객체 반환 int hashCode() 해시코드 반환 boolean isEmpty() Map이 비어있는지 확인 Set keySet() Map에 저장된 모든 key 반환 Object put(Object key, Object value) Map에 vlaue객체를 key객체에 mapping하여 저장 void putAll(Map t) 지정된 Map의 모든 key-value 쌍 추가 Object remove(Object key) 지정한 key객체와 일치하는 key-value객체 삭제 int size() Map에 저장된 key-value쌍의 개수 반환 Collection values() Map에 저장된 value객체 반환
ch11-7~11 ArryList
1. ArrayList
순서 있고, 중복허용
ArrayList는 기존의 Vector를 개선한 것, 구현원리와 기능적으로 동일, Vector는 자체적으로 동기화 처리가 되어있음
저장공간을 배열 사용(배열기반), 모든 종류의 객체 저장 가능
2. ArrayList의 메서드
분류 메서드 설명 생성자 ArrayList() 생성자 ArrayList(Collection c) 컬렉션을 저장하는 생성자 ArrayList(it initialCapacity) 배열의 길이를 설정하는 생성자 추가 boolean add(Object o) 지정된 Object객체를 저장, 성공 true 실패 false 반환 void add(int index, Object element) 지정된 위치 index에 Object객체 추가 boolean addAll(Collection c) Collection이 가지고 있는 요소 모두 저장, 성공 true 실패 false 반환 boolean addAll(int index, Collection c) 지정된 위치 index에 Collection 추가, 성공 true 실패 false 반환 삭제 boolean remove(Object o) 지정된 Object 객체 삭제 Object remove(int index) 지정 위치 index에 있는 객체 삭제 boolean removeAll(Collection c) 지정된 Collection 객체 모두 삭제 void clear 모든 객체 삭제 검색 int indexOf(Object o) 지정된 Object 객체의 위치 반환, 못찾으면 -1을 반환, 순방향 검색 int lastIndexOf(Object o) 지정된 Object 객체의 위치 반환, 못찾으면 -1을 반환, 역방향 검색 boolean contains(Object o) 지정된 Object 객체가 있는지 확인 Object get(int index) 특정 위치 index에 있는 객체 반환 Object set(ind index, Object element) 특정 위치 index에 있는 객체를 지정된 Object 객체로 바꿈 List subList(index fromIndex, int toIndex) fromIndex~toIndex사이의 객체를 새로운 리스트에 저장해 반환 Object[] toArray()
Object[] toArray(Object[] a)ArrayList의 객체 배열을 반환 boolean isEmpty() ArrayList가 비어있는지 확인 void trimToSize() 빈공간 제거 int size() 저장된 객체 개수 반환 3. 실습
ArrayList list1 = new ArrayList(10); // ArrayList에는 객체만 저장가능 list1.add(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)); // autoboxing에 의해 기본형이 참조형으로 자동 변환 ArrayList list2 = new ArrayList(list1.subList(1,4)); // list1에 일부만 list2에 저장 // sublist는 읽기 전용 // List sub = list1.subList(1, 4); // ArrayList list2 = new ArrayList(sub); print(list1, list2); // 오름차순으로 정렬 // Collections 클래스, Collection 인터페이스 Collections.sort(list1); Collections.sort(list2); print(list1, list2); System.out.println("list1.containsAll(list2):" + list1.containsAll(list2)); // containsAll list1에 list2의 모든 요소가 포함되어있는지 확인 list2.add("B"); list2.add("C"); list2.add(3, "A"); // 중간에 추가하면 기존에 있는 요소들 한 칸씩 자리 이동 print(list1, list2); list2.set(3, "AA"); // 3번 index를 AA로 다시 저장 print(list1, list2); list1.add("1"); // 1과 "1"은 int형과 문자열 다름 System.out.println("indexOf=" + list1.indexOf("1")); System.out.println("indexOf=" + list1.indexOf(1)); // 문자열 "1"을 검색 print(list1, list2); // list1.remove(1); // 지정된 index 삭제, 중간에 있는 index 삭제시 뒤에 있는 요소들 한칸씩 앞으로 이동 list1.remove(new Integer(1)); // 1을 삭제 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);
4. ArrayList에 저장된 객체 삭제과정
마지막 데이터 삭제 시 배열 복사 과정 1번은 필요 없음
삽입과정은 반대로 진행, 아래 데이터 복사해 한 칸씩 아래에 복사하고 삽입할 데이터 덮어쓰고 사이즈 증가
배열 모두 삭제 시 마지막 데이터부터 삭제하는 것이 빠르고 깨끗하게 지워짐, 위에서부터 지우면 데이터복사과정에 의해 속도가 느리고 다 지워지지 않는다.
ch11-12~14 LinkedList, ArrayList와 비교
1. 배열의 장단점
장점 : 구조가 간단하고 데이터 접근시간이 짧음
단점 : 크기를 변경하는 경우 새로운 배열을 생성 후 데이터를 복사해야 함, 크기변경을 피하기 위해 큰 배열을 생성하면 메모리 낭비, 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸림(순차적 데이터 추가-끝에 추가, 삭제-끝부터 삭제는 빠름)
2. LinkedList-배열의 단점을 보완
배열은 연속적으로 존재하는 데이터, LinkedList는 불연속적으로 존재하는 데이터를 연결
노드객체에 다음 요소(노드)의 위치를 저장되어 있어 연결됨, 변경에 유리함
데이터 삭제 : 한 번의 참조 변경만으로 가능
데이터 추가 : 한 번의 node객체 생성과 두 번의 참조 변경만으로 가능
3. LinkedList 단점
데이터 접근성이 나쁨, 노드들을
타고 이동하면서 접근해야함
double linked list : 이중 연결 리스트
접근성이 향상, LinkedList 접근성이 나쁜것을 보완함
노드들간 앞 뒤로 연결 가능하게 앞노드와 뒤노드의 위치가 저장
double circular linked list : 이중 원형 연결 리스트
처음과 마지막 요소를 서로 연결해 접근성을 더 높임
4.ArrayList와 LinkedList 성능 비교
순차적 추가 : ArrayList > LinkedList
순차적 삭제 : ArrayList > LinkedList
중간 추가 : ArrayList < LinkedList
중간 삭제 : ArrayList < LinkedList
접근성 : ArrayList > LinkedList
ArrayList는 간단하게 데이터에 접근 가능하기 때문에 빠름
인덱스가 n인 데이터의 주소 = 배열주소 + (n * 데이터 타입의 크기)
컬렉션 읽기(접근시간) 추가/삭제 비고 ArrayList 빠름 느림 순차적 추가/삭제 더 빠름
비효율적 메모리사용LinkedList 느림 빠름 데이터 많을수록 접근성 ↓
ch11-15~18 Stack과 Queue
1. Stack
LIFO구조(Last In First Out), 마지막에 저장된 것을 제일 먼저 꺼냄, 구현은 배열이 효율적
2. Queue
FIFO구조(First In First Out), 제일 먼저 저장한 것을 제일 먼저 꺼냄, 구현은 링크드 리스트가 효율적
3. Stack의 메서드
객체를 생성해서 사용
Stack s = new Stack();
메서드 설명 boolean empty() Stack이 비어있는지 확인 Object peek() Stack의 맨 위에 저장된 객체 반환, pop()과 달리 Stack에서 객체를 꺼내지 않음 = 읽기
비어있을 경우 EmptyStackException 발생Object pop() Stack의 맨 위에 저장된 객체를 꺼냄 = 삭제
비어있을 경우 EmptyStackException 발생Object push(Object item) Stack에 객체(item)을 저장 = 저장 int search(Object o) Stack에서 주어진 객체(o)를 찾아서 위치 반환, 못찾으면 -1 반환
배열과 달리 index는 1부터 시작4. Queue의 메서드
인터페이스라 구현한 클래스 사용하거나 직접 구현해 사용
메서드 설명 boolean add(Object o) 저장된 객체를 Queue에 추가 = 저장
저장 공간 부족하면 IllegalStateException 발생Object remove() Queue에서 객체를 꺼내 반환 = 삭제
비어있으면 NoSuchElementException 발생Object element() 삭제없이 요소를 읽음 = 읽기
비어있으면 NoSuchElementException 발생boolean offer(Object o) Queue에 객체를 저장 = 저장 Object poll() Queue에서 객체를 꺼내서 반환, 비어있으면 null 반환 = 삭제 Object peek() 삭제없이 요소를 읽음, 비어있으면 null 반환 = 읽기 5. Queue 사용하기
직접 구현해 사용
Queue를 구현한 클래스를 사용 → LinkedList, ArrayDeque 등
Queue q = new LinkedList();
ch11-19~21 Stack과 Queue 활용
1. Stack의 활용
수식계산, 수식괄호 검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로
2. Queue의 활용
최근 사용문서, 인쇄작업 대기목록, 버퍼Buffer
ch11-22~24 Iterator, Enumeration, Map과 Iterator
컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화함
1. Iterator 메서드
메서드 설명 boolean hashNext() 읽어 올 요소가 남아있는지 확인 Object next() 다음 요소를 읽어 옴, hashNext()를 이용해 읽어 올 요소 있는지 확인 후 사용 하는것이 안전 void remove() next()로 읽어 온 요소 삭제 void forEachRemaining(Consumer<? super E> action) 컬렉션에 남아있는 요소들에 대한 지정된 작업(action)을 수행, 람다식을 사용하는 디폴트 메서드 ArrayList list = new ArrayList(); // ArrayList list = new HashSet(); // Set은 Collection의 자손이라 iterator사용가능 // for문에서 get()메서드는 사용할 수 없다. // iterator를 이용하면 표준화되어있기때문에 HashSet으로 변경하더라도 코드 변경 없이 사용가능 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); } // iterator는 1회용이라 다쓰고나면 다시 얻어와야 한다. it = list.iterator(); // 새로운 iterator객체를 얻는다. while(it.hasNext()) { Object obj = it.next(); System.out.println(obj); } System.out.println("===for문으로 변경=="); for(int i = 0; i < list.size(); i++) { Object o = list.get(i); System.out.println(o); }
2. Enumeration
Iterator 구버전
메서드 설명 boolean hasMoreElements() 읽어 올 요소 있는지 확인 Object nextElement() 다음 요소 읽어옴, hasMoreElements()으로 확인 후 사용하는 것이 안전 3. ListIterator
Iterator의 접근성을 향상시킨 것 단방향 → 양방향
다음 요소next()뿐만 아니라 이전 요소previous()도 확인 가능
4. Map과 Iterator
Map에는 Iterator()가 없음, keySet(), entrySet(), values()를 호출해 사용
Map m = new HashMap(); Iterator it = m.entrySet().iterator();
ch11-25~29 Arrays
1. Arrays 클래스
배열을 다루기 편리한 메서드(static) 제공
메서드 설명 toString() 배열의 출력 copyOf(배열, 길이) 지정된 배열을 지정된 길이만큼 복사해 새로 만들어서 반환 copyOfRange(배열, from, to) 지정된 인덱스값에 해당하는 배열을 복사해 새로 만들어 반환 fill(배열, 채울 값) 배열을 지정된 값으로 채움 setAll(배열, 람다식) 배열에 지정된 값으로 채우는데 람다식을 사용해 채움 sort(배열) 배열 값을 정렬해 반환 binarySearch(배열, 값) 이진검색을 통해 지정된 값을 찾아 인덱스를 반환, 정렬 후 사용해야함 deepToString(배열) 다차원 배열 출력 deepEquals(배열1, 배열2) 다차원 배열의 비교 asList(배열) 배열을 List로 변환 728x90'정리 > Java' 카테고리의 다른 글
자바의 정석 135~141강 ch12 지네릭스, 열거형, 애너테이션(1) (0) 2023.09.12 자바의 정석 127~134강 ch11 컬렉션 프레임웍(2) (0) 2023.09.10 자바의 정석 연습문제 ch 9 java.lang 패키지와 유용한 클래스 (3) 2023.09.03 자바의 정석 연습문제 ch 8 예외처리 (0) 2023.08.31 자바의 정석 연습문제 ch 7 객체지향 프로그래밍(2) (0) 2023.08.31 다음글이 없습니다.이전글이 없습니다.댓글