The Debugging Chronicles : "코드의 미학"

Mentor JAVA - section16. 컬렉션 프레임 워크 본문

JAVA/Mentor JAVA

Mentor JAVA - section16. 컬렉션 프레임 워크

sweetseonah1004 2024. 7. 27. 22:03

컬렉션 프레임 워크(collection Framework)

- 컬렉션은 기존에 있던 List(리스트), Queue(큐), Tree(트리) 등의 자료 구조를 뜻하고, 프레임워크는 클래스와 인터페이스를 묶어놓은 개념이다.

- 기존에 존재했던 자료 구조에 인터페이스로 설계된 기능을 클래스를 통해 제공하여 데이터 관리에 용이한 자료 구조 객체를 구조화한 것이다.

- List와 Set 인터페이스는 모두 컬렉션 인터페이스를 상속받지만, Map 인터페이스는 구조상의 차이로 별도로 정의된다.

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

제네릭(Generic)

컬렉션 프레임 워크는 데이터 타입을 넣는 것에 제한이 없기 때문에 제네릭은 데이터 타입을 일반화한다는 것을 의미한다.

- 제네릭을 사용하는 이유

· 해당 자료구조 안에 넣을 데이터 타입을 제한하여 사용할 때 에러가 나지 않게 하거나 타입 변환을 위한 검사 등의 번거로움을 없애기 위함이다.

- Generic 선언 및 생성

· 제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를말한다.

· 객체를 생성할 때 지정된 부분(<타입변수>)이 대체되어 해당 클래스는 지정된 객체만을 저장할 수 있게 되어, 따로 타입 변환이 필요 없다

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

· 타입 변수 : 타입을 제한한다. 일반적으로 대문자로 표현 ex) <T>

타입 변수
의미
<T>
Type
<E>
Element
<K>
Key
<N>
Number
<V>
Value

List 컬렉션

- 배열과 유사한 자료 구조로 중복이 허용되면서 저장 순서가 유지되는 구조를 제공한다.

- index를 사용하여 데이터를 저장하거 찾는다.

- 크기 제한이 없으며, 삽입, 삭제, 변경의 기능이 자유롭다.

- 데이터의 크기를 특정할 수 없는 다량의 데이터를 저장할 때 용이하게 사용된다.

- ArrayList, LinkedList, Vector 등이 있다.

- 주요 메서드

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

※ E라는 타입은 List 컬렉션을 생성할 때 지정한 저장 데이터 타입을 말한다.

- ArrayList

가장 많이 사용하는 List 인터페이스의 대표적인 구현 클래스이다.

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

· ArrayList 데이터 저장

add() 메서드를 사용하여 리스트에 값을 추가한다.

중간에 데이터를 추가할 시 추가하려는 위치의 기존 위치에 데이터부터 한 칸 씩 인덱스 값이 증가한다.

 
 
 

· ArrayList 데이터 치환

List에 저장된 데이터를 변경하는 방법으로, 해당 인덱스 위치의 데이터 값을 변경하는 것이다.

set() 메서드를 사용한다.

void set(int index, E value);

· ArrayList 데이터 삭제

리스트의 데이터뿐만 아니라 해당 위치의 공간까지 삭제된다.

데이터의 삭제가 이루어진다면, 빈 공백을 메우기 위해 뒤의 데이터들이 앞으로 이동한다.

remove() 메서드를 사용한다.

· ArrayList 데이터 얻기

get() 메서드를 사용하여 원하는 index 위치에 저장된 값을 불러온다.

- LinkedList

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

LinkedList는 node라는 객체를 생성하여 인접 데이터를 링크해서 체인처럼 관리한다.

노드는 데이터 값과 주소(다음에 오는 노드 값)를 가지고 있어, index가 실제 존재하지 않지만 순서를알 수 있다.

List 컬렉션의 구현 클래스이므로 사용할 수 있는 메서드가 대부분 동일하다.

 

 

· LinkedList 선언

LinkedList는 List 인터페이스 외 다른 기능들도 상속하고 있으므로 LinkedList 본연의 기능을 모두 사용할 경우에는 기본적인

객체 선언 방식을 선택한다.

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

· LinkedList 데이터 저장

추가 기능은 ArrayList와 동일하나 내부적 동작 방식은 다르다.

기존의 연결되어 있던 링크를 끊고, 추가되는 데이터에 새롭게 주소를 연결한다. 그 후 추가되는 노드 뒤에 올 데이터와 링크를 삽입한다.

ArrayList보다 삽입을 빠르게 처리할 수 있다.

 

· LinkedList 삭제

ArrayList와 동일하게 remove() 메서드를 이용하여 삭제하지만, 구현 방식은 다르게 동작한다.

삭제할 데이터와의연결을 끊고 그 뒤의 데이터와 연결하여 쉽게 데이터를 삭제하는 방식이다.

 

 

- ArrayList와 LinkedList의 비교

· ArrayList는 연속성 있게 데이터를 추가할 수 잇으며, 출력 속도가 빠르다.

· LinkedList는 데이터를 특정 위치에 삽입하거나 삭제하는 것이 더 빠르다.

Set 컬렉션

- List와 달리 객체의 저장 순서를 저장하지 않고, 중복을 허용하지 않는다.

- 수학의 집합과 유사한 개념을 지닌다.

 

- 주요 메서드

메서드
기능 설명
void add(E e)
데이터를 순차적으로 삽입
void remove(Object o)
선택된 값 삭제
void clear()
모든 데이터 삭제
int size()
저장된 데이터의 개수 반환
boolean contains(Object o)
데이터 존재 여부 확인

- HashSet 클래스

Set 컬렉션 클래스에서 가장 많이 사용되는 클래스로 인터페이스를 상속받아 구현한다.

Set<E> set = new HashSet<E>(); Set<E> set = new HashSet<>(); // E는 저장할 데이터 타입을 의미

· HashSet 데이터 저장

HashSet은 데이터를 저장할 때 순서(index)를 부여하지 않고, 데이터의 중복을 허용하지 않는다. (= 동일한 값 또는 객체 허용 x)

동일한 객체란, 꼭 같은 타입의 인스턴스를 의미하는 것이 아니다.

 

· HashSet 데이터 삭제

remove(Object o) 메서드를 사용한다.

반복자 Iterator

- List 컬렉션에서 제공하는 인터페이스로 사전적 의미로는 '반복하다'라는 뜻을 지니고 있다.

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

- 제네릭은 순회할 컬렉션이 포함되는 데이터 타입과 동일하게 지정된다.

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

Map 컬렉션

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

- key(키)와 value(값)으로 구분하여 저장하는 방식(key-value)을 사용한다.

- key 값은 중복될 수 없지만, value는 중복이 가능하다.

- Map의 key와 value는 Entry라는 인터페이스를 상속한 객체에 저장되는데 Entry는 Map 인터페이스 안에서 정이 되는

내부 인터페이스를 말한다.

- Map 컬렉션은 Map.Entry 구조를 저장하고, 해당 객체는 key와 value 값을 저장한다.

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

- HashMap, TreeMap, LinkedMap이 있다.

 
 
 

- 주요 메서드

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

- HashMap<K, V>

해싱(hashing)을 통해 Key의 중복 여부를 판단하여 데이터를 업데이트 한다.

· HashMap 선언 및 사용법

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