본문 바로가기

내일배움캠프/Today I Learned

[내배캠] 나의 여덟번째 회고록

겉할기는 안되는거 알지?
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

@ 사진출처 : https://www.google.com/urlsa=i&url=https%3A%2F%2Fhaileyjohj.github.io%2Fdatastructure%2F2019%2F09%2F04%2Fdatastructure_02_stackqueuedeque%2F&psig=AOvVaw3xvO2SylTKgTaT4pP2Gg-C&ust=1668079948852000&source=images&cd=vfe&ved=0CA0QjRxqFwoTCLivypqAofsCFQAAAAAdAAAAABAE 

 

 

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