본문 바로가기
개발언어/Java : 자바

자바 쉽게 배우기 14 - 컬렉션 프레임워크(1) : List

by 개발자D 2023. 2. 3.

컬렉션 프레임워크(1) - LIST

컬렉션 프레임워크

컬렉션 프레임워크는 배열처럼 다수의 데이터를 한 묶음으로 보관, 처리할 수 있는 구조를 의미합니다. 배열보다 많은 기능을 가지고 있어 자주 사용됩니다.

jdk1.2에 등장했으며 자바는 컬렉션 프레임워크를 위한 다양한 인터페이스와 클래스들을 제공하고 있습니다. 인터페이스와 클래스들은 java.util 패키지에 포함되어 있으며 핵심 인터페이스는 List, Set, Map입니다. 사용하려면 해당 클래스를 import 해주어야 합니다.

컬렉션 프레임워크의 큰 틀은 모두 인터페이스로 설계되어 있고 이를 구현한 클래스들을 인스턴스화해 사용합니다. 각 인터페이스와 클래스들의 주요 메서드 위주로 알아봅시다. 

자바 프레임워크 UML다이어그램
출처 : https://developpaper.com/java-collection-notes-list-queue-set-and-map/

인터페이스 특징
List 순서가 있는 데이터의 집합으로 순서로 구분이 가능하기 때문에 데이터의 중복을 허용합니다.

구현 클래스 : ArrayList, LinkedList, Stack, Vector 등
Set 순서가 없는 데이터의 집합으로 List와 달리 데이터의 중복을 허용하지 않습니다.

구현 클래스 : HashSet, TreeSet 등
Map 키(key)와 값(vallue)의 쌍(pair)으로 이루어진 데이터의 집합입니다.
순서가 없으며 키의 중복을 허용하지 않고, 키로 구분이 가능하기 때문에 값의 중복을 허용합니다.

구현클래스 : HashMap, TreeMap, Hashtable, Properties 등

 


배열과의 차이점

컬렉션 프레임워크는 배열보다 많은 기능들을 담고 있습니다. 그렇기에 배열보다 속도가 느려지는 단점이 있습니다. 배열(Array)은 생성 시 크기 지정이 필수이며 지정된 경우 변경이 불가능하지만, 컬렉션 프레임워크의 구조들은 용량과 크기를 유동적으로 조절할 수 있습니다. 

또한, 컬렉션은 기본적으로 구조에 넣을 수 있는 자료형이 정해져 있지 않습니다. 자료형을 지정하고 싶을 땐 지네릭스(제네릭)를 사용합니다. 지네릭스는 추후에 설명하겠습니다.

용량(capacity) : 데이터가 들어갈 수 있는 크기
크기(size) : 실제로 데이터가 들어간 개수

 

 


Collection 인터페이스

List와 Set 인터페이스가 Collection을 상속받으며 Map 인터페이스는 포함되지 않습니다.

 

주요 메서드

리턴타입 메서드명 설명
boolean add(E e) 지정된 객체를 추가
boolean addAll(Collection<? extends E> c) 지정된 자료형을 상속받는 컬렉션 c의 객체 전체를 추가
void clear() 모든 객체 삭제
boolean contains(Object o) 지정된 객체가 컬렉션에 있는지 확인
boolean containsAll(Collection<?> c) 지정된 자료형의 컬렉션 c의 데이터들이 모두 컬렉션에 있는지 확인
boolean equals(Object o) 동일한 컬렉션인지 비교
int hashCode() 컬렉션의 해쉬코드 반환
boolean isEmpty() 컬렉션이 비어있는지 확인
Iterator<E> iterator() 컬렉션의 iterator 반환
boolean remove(Object o) 지정된 데이터를 삭제
boolean removeAll(Collection<?> c) 지정된 컬렉션 객체 삭제
boolean retainAll(Collection<?> c) 지정된 컬렉션에 포함된 객체만들 남기고 다른 객체들은 삭제
int size() 저장된 객체 개수 반환
Object[] toArray() 객체를 객체배열로 반환
<T> T[] toArray(T[] a) 지정된 배열에 컬레션 객체를 저장해서 반환

 

❓ 해쉬코드란 무엇인가요? 

- JVM에서 다른 객체와의 구분을 위해 사용하는 식별값입니다.

 


List 인터페이스

Collection을 상속받았기 때문에 Collection의 메서드들을 사용할 수 있습니다.

List를 구현한 클래스는 Vector, ArrayList, LinkedList 가 있습니다.

 

주요 메서드

리턴타입 메서드명 설명
void add(int index, E element) 지정된 위치에 객체 추가
boolean addAll(int index, Collection<? extends E> c) 지정된 위치에 지정된 자료형을 상속받는 컬렉션의 모든 객체 추가
E get(int index) 지정된 위치의 지정된 자료형의 객체 반환
int indexOf(Object o) 지정된 객체의 위치 (처음부터 순방향)반환 없으면 -1 반환
int lastIndexOf(Object o) 지정된 객체의 위치 (마지막부터 역방향) 반환 없으면 -1 반환
ListIterator listIterator() listIterator(int index) List객체에 접근할 수 있는 ListIterator 반환
E remove(int index) 지정된 위치의 객체 삭제후 삭제된 객체 반환
E set(int index, E element) 지정된 위치에 객체를 element로 변경
void sort(Comparator <? super E> c) 지정된 비교자로 List 정렬
List<E> subList(int fromIndex, int toIndex) 지정된 범위의 객체 반환

- Vector 클래스

Vector클래스는 컬렉션 프레임워크가 등장하기 전부터 존재하던 클래스였습니다. Vector 클래스를 개선해 ArrayList를 만들었습니다.

 

생성자

Vector() : 빈 Vector 인스턴스를 생성합니다.

리턴타입 메서드명 설명
boolean  add(Object o) Vector에 객체를 추가.
추가에 성공하면 true, 실패하면 false를 반환
boolean  remove(Object o) Vector의 객체를 제거.
제거에 성공하면 true, 실패하면 false를 반환
boolean  isEmpty() Vector가 비어있으면 true, 비어있지 않으면 false를 반환
Object  get (int index) 지정된 위치의 객체 반환.
int  size() 저장된 객체 개수 반환

- Stack 클래스

Stack은 후입선출 LIFO(Last In First Out)의 자료구조입니다. 

 

생성자

Stack() : 빈 Stack 인스턴스를 생성합니다.

 

주요 메서드

리턴타입 메서드명 설명
boolean empty() 비어있는지 여부 반환
E peek() 맨 위의 객체 반환 비어있을 때, EmptyStackException 발생
E pop() 맨 위의 객체를 꺼내어 반환 비어있을 때, EmptyStackException 발생
E push(E item) 객체 저장
int search(Object o) 지정한 객체를 찾아서 그 위치를 반환 못찾으면 -1을 반환 위치는 0이 아닌 1부터 시작함

- ArrayList 클래스

 List를 구현한 클래스 중 가장 많이 사용됩니다. List 인터페이스를 구현했기 때문에 List의 특징이 그대로 반영됩니다. 따라서 순서가 있고 순서로 구분이 가능하기 때문에 데이터의 중복이 허용됩니다. 배열(Array)처럼 인덱스가 0부터 1씩 증가하며 커지고, 각 인덱스에 값이 순차적으로 부여됩니다.

 

앞서 설명드린 것처럼, 배열과 달리 크기와 용량이 유동적으로 변경될 수 있습니다. 용량은 ArrayList를 생성할 때 설정할 수 있습니다. 데이터를 추가하면서 List의 용량이 부족해질 경우 자동으로 좀 더 큰 새로운 List를 생성해 기존 List에 저장된 내용을 복사한 후 저장합니다.

 

데이터 추가뿐 아니라 다른 메서드를 사용해서 용량이 변화하게 되면 새로운 List가 만들어지고 값이 복사되어 저장됩니다. 이전의 List는 GarbageCollector에 의해 제거됩니다. 이러한 과정에서 상당한 처리시간이 소요되기 때문에 첫 생성 시 용량을 넉넉하게 잡아두는 것이 바람직합니다.

 

생성자 

ArrayList() : 크기가 10인 ArrayList 생성

ArrayList((Collection <? extends E> c) : 지정한 E를 상속받는 컬렉션 c로 ArrayList 생성

ArrayList(int initialCapacity) : 지정된 초기용량을 갖는 ArrayList 생성

 

주요 메서드

리턴타입 메서드명 설명
Object clone() ArrayList 복제
void ensureCapacity(int minCapacity) ArrayList의 최소용량 지정
void trimToSize() 용량을 크기에 맞게 줄임

- LinkedList 클래스

배열(Array)이나 ArrayList는 데이터들이 순차적으로 저장됩니다. 하지만 LinkedList는 데이터들이 불연속적으로 저장됩니다. 각각의 데이터들은 꼬리물기처럼 연결되어 있습니다. 리스트의 각 요소들이 자신의 데이터와 함께 다음 요소의 주소를 가집니다. 원하는 데이터를 찾기 위해서는 무조건 처음부터이나 끝부터 원하는 데이터가 나올 때까지 사이에 있는 모든 데이터를 거쳐야 합니다. 하지만 데이터의 추가 삭제는 간단합니다. 다음 요소의 주소만 변경해 주면 되기 때문입니다. 

 

이름 방향 추가 기능 특징
링크드 리스트  단방향   다음 요소에 대한 접근은 쉽지만 이전 요소에 대한 접근이 어려움
더블 링크드 리스트 양방향   이전 요소에 대한 접근도 쉬워짐
더블 써큘러 링크드 리스트 양방향 리스트의 첫 번째 요소와 마지막 요소 연결 모든 데이터가 링구조로 연결되어 있기 때문에 접근이 쉬움

 

생성자

LinkedList() : LinkedList 객체를 생성

LinkedList(Collection <? extends E> c) : E를 상속받는 컬렉션 c로 LinkedList 객체 생성

 

주요 메서드

리턴타입 메서드명 설명
void addFirst(E e) 맨 앞에 객체 e 추가
void addLast(E e) 맨 끝에 객체 e 추가
Iteratoer<E> descendingIterator() 내림차순으로 조회하기 위한 descendingIterator 반환
E element() 첫 번째 요소 반환
E getFirst() 첫 번째 요소 반환
E getLast() 마지막 요소 반환
boolean offer(E e) 맨 끝에 객체 e 추가
boolean offerFirst(E e) 맨 앞에 객체 e 추가
boolean offerLast(E e) 맨 끝에 객체 e 추가
E peek() 첫 번째 요소 반환
E peekFirst() 첫 번째 요소 반환
E peekLast() 마지막 요소 반환
E poll() 첫 번째 요소 반환하면서 제거
E pollFirst() 첫 번째 요소 반환하면서 제거
E pollLast() 마지막 요소 반환하면서 제거
E pop() 첫 번째 요소 제거
void push(E e) 맨 앞에 객체 e 추가
E remove() 첫 번째 요소 제거
E removeFirst() 첫 번째 요소 제거
boolean removeFirstOccurrence(Object o) 첫 번째로 일치하는 객체 제거
E removeLast() 마지막 요소 제거
boolean removeLastOccurrence(Object o) 마지막으로 일치하는 객체 제거

 

ArrayList와 LinkedList의 비교

컬렉션 읽기(접근 시간) 추가 / 삭제 비고
ArrayList 빠르다 느리다 순차적인 추가 삭제는 더 빠름. 비효율적인 메모리 사용
LinkedList 느리다 빠르다 데이터가 많을수록 접근성이 떨어짐

 


List를 정렬하는 방법

Collections 클래스의 sort메서드를 사용해 정렬합니다.

Collections.sort(List list)

컬렉션 프레임워크가 시작되었습니다. 이번 글에서는 컬렉션 프레임워크 중 List에 대해 알아보았습니다. 어떤 인터페이스를 구현한 클래스이냐에 따라 색을 다르게 표시해 봤는데요. LinkedList의 색이 두 가지 인 건 실수가 아닙니다. 다음 글에서 이유를 확인해 보세요! 다음 글에서는 Set과 Queue에 대해 설명드리겠습니다. 감사합니다.

 

자바 쉽게 배우기 15 - 컬렉션 프레임워크(2) : Set, Queue

이전글 보러 가기 자바 쉽게 배우기 14 - 컬렉션 프레임워크(1) : List 컬렉션 프레임워크 컬렉션 프레임워크는 배열처럼 다수의 데이터를 한 묶음으로 보관, 처리할 수 있는 구조를 의미합니다. 배

devdharu.tistory.com