IT/JAVA

Java Section 16 : 컬렉션 프레임워크

_KH_ 2025. 1. 23. 21:42

[컬렉션 프레임워크]

컬렉션 프레임워크 : 기존에 존재했던 자료 구조에 인터페이스로 설계된 기능을 클래스를 통해 제공하여 데이터 관리에 용이한 자료 구조 객체를 구조화한 것

- 필요한 자료구조를 미리 구현하여 java.util 패키지에서 제공

컬렉션: 리스트, 큐, 트리 등의 자료구조

프레임워크 : 클래스와 인터페이스를 묶어 놓은 개념

인터페이스 설명 특징 대표 구현 클래스
List 순서가 있는 데이터의 집합 데이터 중복 허용 O ArrayList, LinkedList
Set 순서를 유지하지 않는 데이터의 집합 데이터 중복 허용 X HashSet, LinkedHashSet
Map 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합 순서 유지 X, 키 중복 X, 값 중복 O HashMap, LinkedHashMap, Properties

- List와 Set 인터페이스는 모두 컬렉션 인터페이스를 상속받지만 Map은 별도로 정의

 

[제네릭]

: 데이터의 타입을 일반화하여 사용할 데이터 타입을 컴파일 할 때 미리 지정

- 타입 검사나 변환과 같은 번거로운 작업 생략 가능 및 데이터 타입의 안정성을 높일 수 있음

- 타입을 파라미터로 가지는 클래스와 인터페이스

public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

- <T> : 타입 변수. 타입을 제한하는 역할.

- 객체 생성 시 해당 클래스는 지정된 객체만들 저장할 수 있고, 따로 타입 변환할 필요 없이 데이터 출력 가능

- 하나의 객체로 다양한 데이터 사용 가능

<T> Type
<E> Element
<K> Key
<N> Number
<V> Value

 

[List 컬렉션]

: 배열과 유사한 자료 구조.

- 중복 허용, 저장 순서 유지.

- 배열처럼 index를 통해 데이터를 저장하고 찾는다.

- 배열과 달리 크기의 제한이 없고 삽입, 삭제, 변경의 기능이 자유로움 -> 데이터 크기를 특정할 수 없는 다량의 데이터를 저장할 때 용이하게 사용할 수 있다.

- 대표적으로 List 인터페이스를 상속해 구현한 ArrayList, LinkedList, Vector 등을 사용

 

※ List가 제공하는 주요 메서드

void add (E e) 삽입 데이터를 순차 삽입
void add(int index, E e) 중간 삽입 원하는 인덱스 위치에 삽입
void set(int index, E e) 치환 원하는 인덱스 위치의 값 변경
E get(int index) 반환 선택된 인덱스 위치의 값 반환
void remove(int index) 삭제 선택된 인덱스 위치의 값 삭제
void clear() 전체 삭제 모든 데이터 삭제
int size() 크기 저장된 데이터의 개수 반환
boolean contains(Object o) 검색 데이터 존재 여부 확인

- 삭제의 경우 데이터만 삭제되는 것이 아니라 해당 위치 공간까지 삭제됨

 

① ArrayList

List <데이터 타입(제네릭)> list = new ArrayList <데이터 타입> ();

- 배열과 호환성이 좋음

- 데이터 타입은 항상 객체형(Wrapper 클래스) 으로 지정

 

② LinkedList : 데이터와 다음 데이터의 주소를 가지는 노드(node) 객체가 연결되어 데이터를 저장하는 자료구조

- ArrayList는 배열을 이용해 데이터를 저장하고, LinkedList는 node라는 객체를 생성해서 인접 데이터를 링크하여 체인처럼 관리한다.

- node라는 구조를 가진 클래스들이 체인 형식으로 이어져 있음

- node : 데이터 값, 주소를 가짐. (주소는 다음에 오는 노드의 값을 가져서 연결 구조)

- 인덱스가 존재하지 않아도 서로 연결되어 있어 순서를 알 수 있다.

List<Integer> list = new LiknedList<Integer>();
List<Integer> list = new LinkedList<();
또는
LinkedList<Integer> list = new LinkedList<Integer>();
LinkedList<Integer> list = new LinkedList<>();

 

- 메서드는 ArrayList와 비슷하다.

※ LinkedList 데이터 저장 : 데이터 추가 시 기존에 연결되어 있던 링크를 끊고, 추가되는 데이터에 새롭게 주소를 연결. 또한, 추가되는 노드는 뒤에 올 데이터와 링크하여 삽입한다.

- 노드가 갖고 있는 다음에 오는 개체의 주소만 변경하면 되므로 ArrayList보다 빠르다.

 

※ 데이터 삭제: 삭제된 데이터의 공백을메우기 위해 이후 데이터들을 모두 앞으로 이동시키는 ArrayList와 달리, LinkedList는 삭제할 데이터와의 연결을 끊고 그 뒤의 데이터와 연결하여 쉽게 데이터를 삭제할 수 있다.

 

==> ArrayList는 연속성 있게 데이터를 추가하고(나열 저장), 출력 속도가 빠르지만 특정 위치에 삽입/삭제하는 기능은 LinkedList가 더 좋다. 삽입과 삭제가 빈번할 땐 LinkedList를 쓰자!      

 

[Set 컬렉션] : HashSet, TreeSet, LinkedHashSet

- 객체 저장 순서를 저장하지 않음. 데이터 중복도 허용 X, 인덱스 부여하지 않아서 데이터가 입력된 순서로 출력된다는 보장도 없음

void add(E e) 데이터를 순차적으로 삽입

void remove(Object o) 선택된 값 삭제
void clear() 모든 데이터 삭제
int size() 저장된 데이터의 개수 반환
boolean contains(Object o) 데이터 존재 여부 확인

 

① HashSet 클래스 

- 인터페이스 상속받아 구현

Set<E> set = new HashSet<E>();
Set<E> set = new HashSet<>();

 

※ HashSet 데이터 저장 : 동일한 값 또는 객체 허용 X.  객체의 hassCode() 값을 호출해 비교하고 같으면 equals() 메서드를 호출하여 다시 비교한 후 같은 객체임을 증명한다.

- HashSet에 객체를 저장해야 한다면 해당 객체는 hashCode와 equals 메서드를 사용해 비교하는 로직 필요

 

※ HashSet 데이터 삭제 : 인덱스가 존재하지 않으므로 순서에 의한 삭제 지원 X

 

[반복자 Iterator]

: List 컬렉션의 요소를 순회하여 하나씩 추출하는데 사용.

- 반복자라고도 불리며, Iterator 객체는 선언된 컬렉션 객체에서 가져와 사용한다.

boolean hashNext() 다음에 순회할 데이터 유무 확인.
가져올 객체가 있으면 true, 없으면 false 반환
E next() 다음 위치의 데이터로 이동하여 반환

 

[Map 컬렉션] : HashMap, TreeMap, LinkedHashMap

: Map은 List, Set과 달리 Map 인터페이스가 별도로 존재하며, 데이터를 List 계열 컬렉션과 다르게 처리한다.

"Key - Value" 방식 사용

- key는 중복될 수 없지만, value는 중복 가능

- Map의 key와 value는 Entry라는 인터페이스를 상속한 객체에 저장된다.

- 검색을 요구하는 데이터를 저장하는데 효과적이지만, 데이터를 저장하고 삭제할 때는 다소  느리다.

void put(K key, V value) key에 대응하는 value 저장
E get(K key) key에 대응하는 value 반환
boolean containsKey(K key) key 존재 여부 검색
boolean containsValue(V value) value whswo duqn rjator
Set<E> keySet() 모든 key를 Set 컬렉션에 저장하여 반환
Set<Map.Entry> entrySet() 모든 Map.Entry 객체를 Set에 담아 반환

 

① HashMap<K,V>

- HashSet처럼 key로 지정된 객체의 hashCode와 equals 메서드를 이용해 동일 여부 판단

- key 중복 불가. 중복된 key가 들어오면 기존 key가 지닌 데이터를 업데이트하게 된다.

Map <KEY, V> map = new HashMap<KEY, V>();
Map <KEY, V> map = new HashMap<>();

 

'IT > JAVA' 카테고리의 다른 글

Java Section 18 : 스레드  (1) 2025.01.25
Java Section 17 : 람다식  (0) 2025.01.24
Java Section 15 : 기본 API 클래스  (1) 2025.01.22
Java Section 14 : 예외처리  (1) 2025.01.21
[DAY 14] 컬렉션 프레임워크  (1) 2025.01.21