Java

Java Collection, Generics

H-jinny 2024. 8. 24. 21:36

컬렉션(collection)과 제네릭(generics)

자바에서는 자료구조 과목에서 배우는 많은 자료구조들을 컬렉션으로 만들어 제공한다. 중요한 것은 배열과 달리 가변 크기의 컨테이너로 만들어지며 이를 제네릭이라는 기법으로 구현한다.

 

이렇게 제공되는 도구를 잘 활용하는 것도 중요하니 잘 살펴보려고 한다!

 

 

Collection

자바에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며 JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.

 

핵심적인 컬렉션 프레임워크의 상속 구조

 

Collection 인터페이스는 List, Set, Queue로 크게 3가지 상위 인터페이스로 분류할 수 있다.

추가로 Collection 인터페이스를 상속받진 않지만 Map 역시 Collection으로 분류된다.

 

컬렉션 종류

인터페이스 구현 클래스 특징
Set HashSet
TreeSet
순서를 유지하지 않는 데이터의집합으로 데이터의 중복을 허용하지 않음
List LinkedList
Vector
ArrayList
순서가 있는 데이터의 집합으로 데이터의 중복 허용
Queue LinkedList
PriorityQueue
List와 유사
Map Hashtable
HashMap
TreeMap
키(Key), 값(Value)의 쌍으로 이루어진 데이터 집합. 순서는 유지되지 않으며 키의 중복을 허용하지 않으나 값의 중복은 허용

 

 

 

 

제네릭(generics)

제네릭(generics)은 여러 종류의 타입을 다룰 수 있도록 클래스나 메서드를  '요소<E>', '키<K>', '값<V>' 와 같은 타입 매개변수(generic type)을 이용하여 선언하는 기법이다. 아래처럼이 컬렉션 클래스에 포함된다.

class Stack<E> {
	...
    void push(E element) { ... }
    E pop() { ... }
    ...
}

 

따라서 int, char, double 등 기본 타입이 아닌 Wrapper 클래스로 지정해야한다. 대신 자동 박싱(auto boxing)에 의해, 예를 들면 int 타입을 Integer 객체로 변환해준다. (반대는 자동 언박싱)

 

 

다이아몬드 연산자<>

Java 7 부터는 제네릭 객체 생성부의 <> 내에 매개변수를 생략하면 컴파일러가 추론하여 타입 매개변수를 찾아준다!

ex) ArrayList<String> str = new ArrayList<>();

 

 

 

활용하기

컬렉션은 Collection 인터페이스를 상속받기 때문에 메서드가 공통적으로 쓰인다. 주요 메서드는 다음과 같다.

 

주요 메서드

boolean add(E element) 맨 뒤에 데이터 element 추가
void add(int index, E element) index 위치에 element 삽입
boolean addAll(Collection c) 컬렉션 c의 모든 요소를 맨 뒤에 추가
E get(int index)  index 위치 요소 리턴
E set(int index, E element) index 위치 요소를 element로 수정(이전 값은 리턴)
void clear() 모든 요소 삭제
E remove(int index) index 위치 요소 삭제
boolean remove(Object o) o와 동일한 요소 삭제
int size() 저장된 요소의 개수 리턴
boolean contains(Object o) o를 포함하고 있으면 true 리턴
int indexOf(Object o) o가 저장된 인덱스 리턴, 없으면 -1 리턴
boolean isEmpty() 저장된 요소가 없으면 true
Object[] toArray() 모든 요소를 포함한 배열 리턴

 

 

비슷한 컬렉션인 ArrayList와 Vector를 비교해보자.

 

ArrayList를 살펴보면 다음과 같다.

ArrayList<E> : java.util.ArrayList

가변 크기의 배열을 구현한 컬렉션 클래스이다.

스레드 간의 동기화 지원 안되기 때문에 다수의 스레드가 동시에 ArrayList 요소삽입/삭제 시 데이터 훼손 우려되지만, 멀티 스레드 동기화 시간 소모가 없어 Vector 보다 속도 빠르다.

 

Vector의 경우 위의 메서드를 동일하게 사용하면서도, ArrayList와 달리 다음 메서드를 포함한다.

int capacity() 저장공간 크기 리턴

 

 

Iterator<E>

요소가 순서대로 저장된 컬렉션의 경우 요소를 순차 검색할 때 Iterator<E> 인터페이스를 사용하면 편리하다.

다음처럼 사용할 수 있다.

ArrayList<Integer> list = new ArrayList<>();
Iterator<Integer> it = list.iterator(); // list의 각 요소를 순차 검색할 Iterator 객체 리턴
while (it.hasNext()) { // list의 끝까지 반복
	int n = it.next(); // it가 가리키는 요소 리턴
    ...
}
boolean hashNext() 방문할 요소가 남아 있으면 true 리턴
E next() 다음 요소 리턴
void remove() 마지막으로 리턴된 요소 제거

 

 

비교적 간단하게 요약되었는데, 제네릭을 직접 만드는 것은 따로 작성할 예정이다.

 

 

참고

황기태, 김효수. (2021). 명품 자바 프로그래밍. 생능출판

https://gangnam-americano.tistory.com/41

https://velog.io/@dongzooo/%EC%9E%90%EB%B0%94-%EC%BB%AC%EB%A0%89%EC%85%98Collection-%ED%95%9C-%EB%88%88%EC%97%90-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0

 

 

 

 

오타, 지적 감사합니다 :)