[JAVA]컬렉션(Collection) 정리

diense_kk·2023년 11월 11일
0

Developer

목록 보기
7/8

Java Collections Framework

컬렉션(collection) 은 많은 데이터 요소를 효율적으로 관리하기 위한 자료구조를 말하며 이 컬렉션들은 제네릭(generics) 형식으로 구현되어 있어 컬렉션과 함께 제네릭에 대해서도 알아둘 필요가 있다. 

컬렉션이란 많은 수의 데이터를 그 사용 목적에 적합한 자료구조로 묶어 하나로 그룹화한 객체를 말한다. 자바에서는 이러한 컬렉션을 위한 인터페이스와 클래스들이 있으며 자주 사용되는 클래스들의 종류와 상속 계층도는 아래와 같다. 

List : 이름과 같이 목록처럼 데이터를 순서에 따라 관리다. 
Set : 중복이 허용되지 않는 데이터를 관리한다. 
Map : 데이터를 Key와 Value로 짝을 이루어 관리하며, Key값은 중복을 허용하지 않는다. 
Queue : 데이터 In / Out 순서를 FIFO 방식으로 관리한다. (FIFO : First In First Out)
Stack : 데이터 In / Out 순서를 LIFO 방식으로 관리한다. (LIFO : Last In First Out)

1. Set 인터페이스

순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.

1. HashSet
가장빠른 임의 접근 속도
순서를 예측할 수 없음

2. TreeSet
정렬방법을 지정할 수 있음

2. List 인터페이스

순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.

1. LinkedList
양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임

2. Vector
과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음

3. ArrayList
단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남

3. Map 인터페이스

키(Key), 값(Value)의 쌍으로 이루어진 데이터으 집합으로,
순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.

1. Hashtable
HashMap보다는 느리지만 동기화 지원
null불가

2. HashMap
중복과 순서가 허용되지 않으며 null값이 올 수 있다.

3. TreeMap
정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름

컬렉션의 특징

컬렉션 클래스들이 데이터를 다룰 때 그 데이터는 기본적으로 객체만 가능하다. 따라서 char, int, float와 같은 기본형은 사용할 수 없고 대신 Wrapper클래스를 사용해야 한다. 하지만, 오토박싱(auto boxing)과 오토언박싱(auto unboxing)으로 인해 사용자는 마치 기본형을 다룰 수 있는 것처럼 사용할 수 있다. 
컬렉션과 관련된 인터페이스 또는 클래스가 정의되어 있는 코드를 살펴보면 아래와 같이 제네릭(generics) 형태로 구현되어 있는 것을 확인할 수 있다. 따라서 사용자는 사용하고자 하는 데이터 타입을 지정하여 사용할 수 있다. 

박싱 : 기본 타입 데이터에 대응하는 Wrapper 클래스로 만드는 동작
언박싱 : Wrapper 클래스에서 기본 타입으로 변환

// 박싱
int i = 10;
Integer num = new Integer(i);

// 언박싱
Integer num = new Integer(10);
int i = num.intValue();

컬렉션 인터페이스

public interface List<E> extends Collection<E> {   ...   }

List, Set, Queue는 공통분모로 Collection 인터페이스를 상속받고 있다.

제네릭(Generics)

제네릭은 한 번의 정의로 여러 종류의 데이터의 타입을 다룰 수 있도록 하는 방법을 말한다. 예를들어 아래와 같이 ArrayList 형태로 클래스가 정의되어 있다면, 사용자는 데이터로 String을 사용할 때는 ArrayList으로, Integer를 사용할 때는 ArrayList로 지정하여 사용할 수 있다. 
이처럼 사용자가 사용시에 데이터 타입을 지정하게 되면 컴파일 단계에서 데이터 타입을 미리 체크할 수 있는 장점이 있다. 

사용 예시

ArrayList<String> a1 = new ArrayList<String>( );
ArrayList<Integer> a2 = new ArrayList<Integer>( );

0개의 댓글