겉할기는 안되는거 알지?
Deep하게~
8. 컬렉션(Collections)
java에서 컬렉션이란 데이터의 집합, 그룹을 의미하며
JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.
* Java 컬렉션 프레임워크의 상속 구조
Collection 인터페이스는 List, Set, Queue로 크게 3가지 상위 인터페이스로 분류할 수 있다.
또한 Map의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류된다.
Collection 인터페이스의 특징
인터페이스 | 구현클래스 | 특징 |
Set | HashSet TreeSet |
순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다. ○ HashSet : 가장 빠른 임의 접근 속도 / 순서를 예측할 수 없음 ○ TreeSet : 정렬방법을 지정할 수 있음 |
List | LinkedList Vector ArrayList |
순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다. ○ LinkedList : 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용하다 ○ Vector : 과거에 대용량 처리를 위해 사용하였으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음 ○ ArrayList : 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남 |
Queue | LinkedList PriorityQueue |
List와 유사 |
Map | Hashtable HashMap TreeMap |
키(Key), 값(Value)의 쌍으로 이루어진 데이터으 집합으로, 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다. ○ Hashtable : HashMap보다는 느리지만 동기화 지원, null불가 ○ HashMap : 중복과 순서가 허용되지 않으며 null 값이 올 수 있다. ○ TreeMap : 정렬된 순서대로 키(key)와 값(value)를 저장하여 검색이 빠름 |
@ 출처 : https://gangnam-americano.tistory.com/41
9. 스택, 큐, ArrayDeque
# 스택(Stack) : 마지막에 저장한 데이터를 가장 먼저 꺼내는 LIFO구조(Last In First Out)
# 큐(Queue) : 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 구조(First In First Out)
# Deque(Double-Ended-Queue) : Queue의 변형으로 Deque(덱, 디큐 라고 읽음)이 생겨남. Deque은 양쪽 끝에 추가/삭제가 가능하며 Deque의 조상은 Queue이므로 구현체로는 ArrayDeque와 LinkedList 등이 있다.
* 스택은 순차적으로 데이터를 추가하고 삭제하기 때문에 배열 기반인 ArrayList와 같은 컬렉션 클래스가 적합
* 큐는 데이터를 꺼낼 때 항상 첫 번째 저장된 데이터를 삭제하기 때문에 배열기반의 컬렉션보다 데이터 추가/삭제가 쉬운 LinkedList가 적합
# Deque(Double-Ended-Queue) : Queue의 변형으로 Deque(덱, 디큐 라고 읽음)이 생겨남. Deque은 양쪽 끝에 추가/삭제가 가능하며 Deque의 조상은 Queue이므로 구현체로는 ArrayDeque와 LinkedList 등이 있다.
@ 글 출처 : https://staticclass.tistory.com/100
10. 제네릭스
●제네릭스란 ? 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시 타입체크를 해주는 기능
[제네릭을 사용하지 않을 때]
ArrayList<E> list = new ArrayList<E>();
list.add(10); list.add("10");
String word = (String)list.get(1);
-> 제네릭스를 사용하지 않으면 Object로 타입을 지정하고, 안에 있는 객체를 꺼낼 때마다 형변환을 해줘야 한다.
[제네릭을 사용할 때]
ArrayList<String> list = new ArrayList<String>();
list.add("10"); list.add("20");
String word = list.get(0);
- >제네릭스를 사용할 경우 타입을 지정해주고, 형변환을 사용하지 않아도 된다. 컬렉션 클래스는 보통 한 종류의 객체만 담기 때문에 제네릭스를 사용하는 것이 훨씬 편리하다.
●제네릭스의 장점?
타입 안정성을 제공한다(코드를 잘못 입력하게 되면 컴파일 에러가 발생하므로 오류를 바로바로 체크할 수 있음)
타입체크와 형변환을 생략할 수 있으므로 코드가 간결해짐
* 제네릭의 다형성 : 제네릭 타입은 항상 같아야 한다.
- 제네릭 타입이 조상 클래스와 자손클래스로 다르게 입력되어서는 안된다.
제네릭 클래스는 무조건 제네릭 타입이 일치해야 한다.
ArrayList<Tv> list = new ArrayList<Tv>(); --> OK
ArrayList<조상 클래스> list = new ArrayList<자손 클래스>(); --> ERROR
- 하지만, 제네릭 클래스, 매개변수의 다형성은 성립된다.
👉 제네릭 클래스 간의 다형성
List<Tv> list = new ArrayList<Tv>();
List<Tv> list = new LinkedList<Tv>(); --> 둘 다 OK
👉 매개변수의 다형성
ArrayList<조상클래스> list = new ArrayList<조상클래스>();
list.add(new 자손클래스()); --> OK
@출처 : https://dahliachoi.tistory.com/m/46
'내일배움캠프 > Today I Learned' 카테고리의 다른 글
[내배캠] 나의 열번째 회고록 (0) | 2022.11.13 |
---|---|
[내배캠] 나의 아홉번째 회고록 (0) | 2022.11.10 |
[내배캠 회고록] 나의 일곱번째 회고록 (0) | 2022.11.08 |
[내배캠 회고록] 나의 여섯번째 회고록 (1) | 2022.11.07 |
[내배캠 회고록] 나의 다섯번째 회고록 (0) | 2022.11.04 |