230726 JAVA Collection
생성 일시: 2023년 7월 25일 오후 4:26
- Collection Framework
- List
- Set
- Map
- Queue
- Stack
- 정렬
Collection Framework
- 틀, 뼈대: 객체들을 한곳에 모아 놓고 편리하게 사용할 수 있는 환경을 제공
- 인터페이스의 일종이라고 생각하면 됨! (강제성, 독립성)
- 정적 자료구조 (Static data structure)
- 고정된 크기의 정적 자료구조
- 배열이 대표적인 정적 자료구조
- 선언 시 크기를 명시하면 바꿀 수 없음
- 동적 자료구조 (Dynamic data structure)
- 요소의 개수에 따라 자료구조의 크기가 동적으로 증가하거나 감소
- 리스트, 스택, 큐 등
- 자료구조들의 종류는 결국은 어떤 구조에서 얼마나 빨리 원하는 데이터를 찾는가에 따라 결정된다
- 순서를 유지할 것인가?
- 중복을 허용할 것인가?
- 다른 자료구조들에 비해서 어떤 단점과 장점을 가지고 있는가?
!! Map
은 Collection에서 상속받진 않지만 일종으로 묶여서 불림
java.util
패키지
- 다수의 데이터를 쉽게 처리하는 방법 제공
Collection Framework 핵심 interface
interface | 특징 |
---|---|
List | 순서가 있는 데이터의 집합, 데이터 중복 가능 |
ex 일렬로 줄 서기
ArrayList, LinkedList, Vector |
| Set | 순서를 유지하지 않는 데이터의 집합, 데이터 중복 불가
ex 로또 당첨 번호
HashSet, TreeSet… |
| Map | key와 value의 쌍으로 데이터를 관리하는 집합, key의 중복 불가, value는 중복 가능
ex 속성 - 값
HashMap, TreeMap |
| Queue | 지하철, 버스를 탈 때 대기줄과 같이 들어온 순서대로 나가는 자료구조
LinkedList |
Collection interface
분류 | Collection |
---|---|
추가 | add(E e) |
addAll(Collection <? extends E>c) | |
조회 | contains(Object o) |
containsAll(Collection<?> c) equals() isEmpty() iterator() size() | | 삭제 | clear() removeAll(Collection<?> c)
retainAll(Collection<?> c) |
| 수정 | |
| 기타 | toArray() |
List
List
- 특징: 순서가 있고, 중복을 허용 (배열과 유사)
- 구현 클래스
- ArrayList
- LinkedList
- Vector
- 내부적으로 배열을 이용하여 데이터를 관리
- 배열과 다르게 크기가 유동적으로 변함 (동적 자료구조)
- 배열을 다루는 것과 유사하게 사용할 수 있음
- 주요 메서드
분류 Collection List 추가 add(E e), addAll(Collection<? extends E> c) add(int index, E element) addAll(int index, Collection<? extends E> c) 조회 contains(Object o) containsAll(Collection<?> c) equals() isEmpty() iterator() size() get(int index) indexOf(Object o) lastIndexOf(Object o) listIterator() 삭제 clear() removeAll(Collection<?> c) retainAll(Collection<?> c) remove(int index) 수정 set(int index, E element) 기타 toArray() subList(int fromIndex, int toIndex)
주요 메서드
//문자열을 저장할 List, 구현체는 ArrayList
List<String> names = new ArrayList<>();
//추가
names.add("양만춘");
names.add("홍길동");
names.add("양만춘");
names.add("이순신");
names.add(0, "임꺽정");
System.out.println(names);
Array 복습
- 같은 타입의 데이터를 묶어 사용하는 자료구조
- 접근 속도가 빠름
메모리 공간에 할당되어 저장되기 때문에 주소값을 알고 있어서 빠르게 접근 가능 - 크기를 변경할 수 없어 추가 데이터를 넣을 때, 새로운 배열을 만들고 복사함
- 데이터 삭제 시, 인덱스를 재조정하기 위해 전체 데이터를 옮겨야 함
- ArrayList 역시 Array를 활용하므로 이 같은 특징을 가지고 있음
ArrayList
add(E e)
데이터 입력get(int index)
데이터 추출: 인덱스로 바로 접근할 수 없으므로get
활용- 인덱스로만 get 할 수 있나 보네…
size()
입력된 데이터의 크기 반환remove(int i)
특정한 데이터를 삭제: 인덱스로 삭제remove(Object o)
특정한 데이터를 삭제: o 에 해당하는 데이터 삭제clear()
모든 데이터 삭제contains(Object o)
특정 객체가 포함되어 있는지 체크isEmpty()
비어있는지 체크 (true, false return)addAll(Collection c)
기존 등록된 콜렉션 데이터 입력iterator()
iterator 인터페이스 객체 반환
LinkedList
- 각 요소를 Node로 정의하고 node는 다음 요소의 참조 값과 데이터로 구성됨
- 각 요소가 다음 요소의 링크 정보를 가지며 연속적으로 구성될 필요가 없음
Set
Set
- 집합을 나타내는 자료 구조
- 특징: 순서가 없고, 중복을 허용하지 않음
- 장점: 빠른 속도, 효율적인 중복 데이터 제거 수단
- 단점: 단순 집합의 개념으로 정렬하려면 별도의 처리가 필요함
- 구현 클래스
- HashSet
- 해시 테이블에 원소를 저장
- 성능면에서 우수하다고 알려져 있음
- 원소들의 순서가 일정하지 않음
- TreeSet (Binary Search Tree) → 지금 할 필요는 없음
- red-black tree에 원소 저장
- 값에 따라서 순서가 결정
- 값을 순서대로 정렬할 필요가 있다면 고려해 볼 만한 선택지
- HashSet
Hash??
값을 하나하나 비교하는 equals로 값을 찾음, hash 연산값이 다르면 다른 값으로 판단
값의 크기가 클수록 값들의 중복은 줄어들지만 차지하는 메모리가 많아짐
add(E e)
데이터 입력size()
입력된 데이터의 크기 변환remove(Object o)
특정한 데이터를 삭제clear()
모든 데이터 삭제contains(Object o)
특정 객체가 포함되어 있는지 체크isEmpty()
비어있는지 체크 (true, false return)iterator()
iterator 인터페이스 객체 반환toArray()
Set의 내용을 Object 형의 배열로 반환
Map
Map
- 사전과 같은 자료구조
- 특징: Key(키)와 value(값)를 하나의 Entry로 묶어서 데이터 관리
- 순서는 없으며, 키에 대한 중복은 없음! 값은 중복될 수 있음
- 장점: 빠른 속도
- 구현 클래스
- HashMap
Map<키 자료형, 값 자료형> map = new HashMap<>(); HashMap<String, String> map = new HashMap<>();
- TreeMap
- HashMap
V put(K key, V value)
데이터 입력- 중복된 키값을 넣으면 새로운 값으로 바뀜 → 덮어쓰기!
V get(Object key)
데이터 추출V remove(K key)
키의 값을 지우고 반환, 없다면null
을 반환boolean containsKey(Object key)
특정한 key 포함 여부void putAll(Map<K key, V value> m)
기존 콜렉션 데이터 추가Set<Map.Entry<K, V>> entrySet()
- (key와 value) 쌍을 표현하는 Map, Entry 집합을 반환
Queue
Queue
- queue는 인터페이스, 구현체는 LinkedList를 사용
- 큐 자료구조: FIFO, (first-in-first-out) 가장 먼저 들어온 값이 가장 먼저 빠져나감
boolean offfer(E e)
데이터를 추가E peek()
가장 앞에 있는 데이터 조회E poll()
가장 앞에 있는 데이터 빼내기boolean isEmpty()
큐가 비어 있는지 여부
Stack
Stack
- Stack 클래스를 사용
- 스택 자료구조: LIFO, (last-in-first-out) 가장 나중에 들어온 값이 가장 먼저 빠져나감
E push(E e)
데이터를 추가E peek()
가장 위에 있는 데이터 조회E pop()
가장 위에 있는 데이터 빼내기boolean isEmpty()
스택이 비어 있는지 여부
정렬
- 요소들을 특정 기준에 맞추어 내림차순 또는 오름차순으로 배치하는 것
- 순서를 가지는 Collection들만 정렬 가능
- Collections의 sort()를 이용한 정렬
Comparable interface
T와 o를 비교한 후 뺀 값 (T-o) 에 따라서 결과값이
- 양수: 자리 바꿈
- 음수: 자리 유지
- 0: 동일 위치
public interface Comparable<T> {
public int compareTo(T o);
}
ex 숫자를 기준으로 기본 오름차순
정렬인데, 예를 들어 56, 20
두 숫자 56 - 20 > 0 일 경우 자리 바꾸기
Comparator의 활용
- 객체가 Comparable을 구현하고 있지 않거나 사용자 정의 알고리즘으로 정렬하려는 경우
- String을 알파벳 순이 아니라 글자 수 별로 정렬을 하고 싶다
sort(List<T> list, Comparator<? Super T> c)
public class StringLengthComparator implements Comparator<String> { @Override public int compare(String o1, String o2) { int len1 = o1.length(); int len2 = o2.length(); return Integer.compare(len1, len2); } } public void istringLengthSort() { Collections.sort(names, new StringLengthComparator()); System.out.println(names); }
public interface Comparator<T> { int compare(T o1, T o2); }
- 1회성 객체 사용 시 anonymous inner class 사용
- 클래스 정의, 객체 생성을 한번에 처리
//before Collections.sort(names, new StringLengthComparator()); //after Collections.sort(names, new Comparator<String>() { @Override public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } });
- 람다 표현식 사용
Collections.sort(names, (o1, o2) -> { return Integer.compare(o1.length(), o2.length()); });
** 실습 내용 중 **
toArray 메소드
list.toArray(res);
res라는 array에 list를 넣는다는 느낌인 듯. 하지만 res라는 array는 list의 사이즈만큼의 공간으로 만들어 줘야 함
'Java > 기본 문법' 카테고리의 다른 글
JAVA 객체지향 프로그래밍 - 인터페이스, 제네릭 (0) | 2023.08.11 |
---|---|
JAVA 객체지향 프로그래밍 - 다형성 (0) | 2023.08.10 |
JAVA 객체지향 프로그래밍 - 상속 (0) | 2023.08.10 |
JAVA 객체지향 프로그래밍 - 객체 (0) | 2023.08.09 |
JAVA 객체지향 프로그래밍 - 클래스와 메소드 (0) | 2023.08.09 |