Adventure Time - Finn 3
본문 바로가기
카테고리 없음

컬렉션 프레임워크

by hyun9_9 2024. 1. 12.

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

 

List와 Set인터페이스는 모두 컬렉션 인터페이스를 상속받기만 Map인터페이스는 구조상의 차이로 별도로 정의됩니다

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

 


제네릭

데이터의 타입을 일반화한다는 것을 의미합니다. 클래스나 메서드 정의 시 일반화하여 사용할 데이터 타입을 컴파일할 때 미리 지정하는 방법입니다

 

제네릭을 사용하는 이유 

저장 데이터 타입이 Object이므로 어떤 타입의 데이터라도 저장할 수 있지만 데이터를 사용할 때는 타입 변환을 위한 검사를 해야 하는 번거로움이 있습니다 이때 제네릭을 사용하면 원하는 데이터 타입을 자유롭게 지정하여 저장할 수 있습니다

 

Generic 선언 및 생성

제네릭 타입은 타입을 파라미터로 가지는 클래스와인터페이스를 말한다 클래스 또는 인터페이스 이름 뒤에 <>기호를 추가하고 안에 타입 파라미터를 입력합니다

 

public class 클래스명 <T> {...}

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

T를 타입 변수라고 하며 이를 이용해 탕비을 제한합니다 여러개의 탑변수는 쉽표로 구분하여 명시할 수 있습니다 타입파라미터는 정해진 규칙은 없지만 일반적으로 알파벳 대문자 한 글자로 표현합니다

 

제네릭 표현

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

 

클래스에 제네릭을 부여하면 해당클래스를 선언할 때 데이터 타입을 부여하게 됩니다 그러면 객체를 생성할 때 타입이 지정된 부분이 대체되어 해당 클래스는 지정된 객체만을 저장할 수 있게 되고 따로 타입을 변환할 필요 없이 데이터를 출력할 수 있습니다 또한 클래스를 사용해 다른 데이터를 저장하고 싶다면 DataList클래스를 다시 선언하여 원하는 데이터 타입을 부여한 후 사용하면 됩니다. 이렇듯 제네릭을 이용하면 하나의 객체로 다양한 데이터를 사용할 수 있습니다

 


 List컬렉션

배열과 유사한 자료 구조로 중복이 허용되면서 자장 순서가 유지되는 구조를 제공합니다 즉 배열처럼 index를 사용해 데이터를 저장하고 찾게 됩니다 다만 배열과는 다르게 크기의 제한이 없으며 삽입 삭제, 변경의 기능이 지유롭습니다 데이터의 크기를 특정할 수 없는 다량의 데이터를 저장할 때 용이하게 사용할 수 있는 자료 구조입니다 

 

List 컬렉션은 List인터페이스를 생성하여 기능을 정의하고 하위 클래스에 상속해 그 기능을 구현하도록 합니다. List인터페이스를 상속하여 구현한 ArratList, LinkedList,vector등을 List계열 자료구조로 사용합니다

메서드 동작 기능 설명
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라는 타입이 있는데 dlmsms List 컬렉션을 생성할 때 지정한 저장 데이터 타입을 반영하게 됩니다

 

ArrayList

List<데이터 타입> list =new ArrayList<데이터 타입>():

자료 구조 선언 시 저장할 데이터의 탕비을 명시해야 하는데 지정되는 데이터는 항상 객체형으로 지정해야 합니다 int형 ,long형 ,double형과 같은 기본 자료형은 대응하는 Wrapper클래스를 이용하여 지정합니다

 

ArratList 데이터 정장 

데이터를 추가하려면 add(E e) 또는 add(int index, E e) 메서드를 사용합니다 여기서 E는 리스트 선언 시 지정한 자징 데이터 객체를 의미합니다

일반적인 add(E e) 메서드를 이용해 데이터를 삽입하면 기존에 존재하는 마지막 데이터의 뒤에 차례대로 삽입됩니다 삽입 시에는 index가 부여되며 배열과 마찬가지로 순차적으로 부여됩니다

add(int index, E e) 메서드는 원하는 index위치에 데이터를 삽입할 수 있습니다 그러나 연속성 없이 순서를 부여해 삽입하는 것은 불가능 합니다

데이터 삽입을 원하는 위치에 기존테이터가 존재한다면 기존 데이터는 뒤로 이동하게 되고 새로운 데이터가 그 자리에 추가 됩니다 하지만 추가를 원하는 위치가 연속성이 없는 위치라면 문법적으로는 오류가 발생하지 않지만 실행 시 오류가 발생합니다

 

ArrayList데이터 치환 

뵨경을 원하는 index 위치와 치환할 값 또는 객체를 지정하면 해당위치의 값이 변경됩니다

void set (int undex,E value)

 

ArrayList데이터 삭제 

삭제는 단지 데이터만 삭제되는 것이 아니라 해당 위치의 공간까지 삭제됩니다

배열의 경우 공간이 생성되면 삭제할 수 없지만 List는 원하는 공간을 삭제할 수 있는 빈공백을 메우기 위해 뒤의데이터들이 앞으로 이동합니다

 

데이터를 삭제할때는 remove()메서드를 이용합니다 

remove(int dex)는 index를 이용해 특정 위치의 데이터를 삭제하고 remove(Object o)는 저장한 데이터를 삭제하고 remove(Object o)는 저장한 데이터를 삭제합니다

 

ArrayList 데이터 얻기

List에 담긴 값을 가져 올때는 E get(int index)메서드를 이용해 원하는 index 위치에 저장되어 있는 값을 출력할 수 있습니다

 

 

2 LinkedList

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

ArrayList와 마찬가지로 List컬렉션의 구현 클래스이므로 사용할 수 있는 메서드가 대부분 동일합니다 ArrayList는 배열을 이용해 데이터를 저장하는 반면 LinkedList는 node라는 객체를 생성하여 인접 데이테를 링크해서 체인처럼 관리합니다

 

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

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

또는

LinkedList<Integer>list =new LinkedList<Integer>();

LinkedList<Integer>  list = new LinkedList<>();

 

부모 타입으로 선언하거나 기본 선언 방식인 자신의 자신의 객체 타입 그대로 선언하는 방식을 택하게 됩니다

LinkedList는 List인터페이스외 다은 기능들도 상속하고 있으므로 LinkedList 본연의 기능을 모두 사용할 경우에는 기본적인 객체 선언 방식을 선택합니다

 

LinkedList 데이터 저장

데이터 추가기능은 ArrayList와 동일합니다 add(E e)또는 add(int index, E e)메서드를 이용해 데이터를 추가합니다 하지만 내부적으로 동작하는 방식은 상당히 다릅니다

 

LinkedList에서 데이터를 추가할 때는 기존에 연결되어 있던 링크를 끊고 추가되는 데이터에 새롭게 주소를 연결합니다 또한 추가되는 노드는 뒤에 올 데이터와 링크하여 삽입합니다 ArrayList는 삽입되는 위치부터 맨 뒤의 데이터까지 이동시키고 데이터를 삽입하기 때문에 삽입속도가 느리지만 LinkedList는 노드가 가지고 있는 다음에 오는 개체의 주소만 변경하면 되므로 빠르게 처리할 수 있습니다

 

LinkedList 삭제

삭제는 ArrayList와 동일하게 remove(int index)또는 remove(Object o)메서드를 이용합니다 List를 상속한 자료 구조들은 List인터페이스를 상속하여 구현 했으므로 사용 메서드는 동일합니다 하지만 구현 방식은 ArrayList와는 다르게 동작합니다.ArrayList의 경우 삭제된 데이터의 공백을 메우기 위해 이후 데이터들을 모두 앞으로 이동시키는 반면 LinkedList는 삭제할 데이터와의 연결을 끊고 그뒤의 데이터와 연결하여 쉽게 데이터를 삭제합니다

 

ArrayList와 LinkedList의 성능을 비교하면 그 성격이 뚜렷하게 나타납니다

ArrayList의 경우 연속성 있게데이터를 추가할 수 있으며 출력 속도가 빠릅니다 그러나 데이터를 특정 위지에 삽입하거나 삭제하는 것은 LinkedList가 우위에 있습니다 따라서 데이터를 나열하여 저장하고 사용할때는 ArrayList를 삽입과 삭제가 빈번한 경우에는 LinkedList를 사용하는 것이 좋습니다


Set 컬렉션

List 컬렉션과 다르게 객체의 저장순서를 저장하지 않습니다 Set컬렉션은 수학의 집합과 유사한 개념을 지니고 있습니다

List컬렉션은 데이터 저장 시 중복을 허용하지만 Set컬렉션은 데이터의 중복을 허용하지 않습니다 또한 데이터를 저장할 때 순서, 즉 index를 부여하지 않기 때문에 데이터가 입력된 순서로 출력된다는 보장이 없습니다

 

Set 컬렉션은 Set 인터페이스를 상속해 구현되었습니다 대표적으로 HashSet,TreeSet,LinkedHashSet을 Set계열 자료 구조로 사용합니다 

 

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

 

1 HashSet 클래스

HashSet 클래스는 Set 컬렉션 클래스에서 클래스에서 가장 많이 사용되는 클래스로 인터페이스를 상속받아 구현합니다 HashSet 클래스를 선언하는 방법은 다음과 같습니다

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

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

E는 Set컬랫션에 저장할 데이터 타입을 의미합니다 Set 컬렉션을 선언할 때 어떤 데이터 형식을 저장할지 제네릭을 통해 지정하게 됩니다

 

HashSet 데이터 저장

HashSet은 데이터를 저장할 때 순서(index)를 부여하지 않고 데이터의 중복을 허용하지 않습니다 즉, 동일한 값 또는 객체를 허용하지 않는다는 의미입니다. 여기서 동일한 객체란, 꼭 같은 타입의 인스턴스를 의미하는 것은 아닙니다 HahSet은 데이터를 객체의 hashCode() 값을 호출하여 비교하고 같으면 equals() 메서드를 호출하여 다시 비교해 두 객체가 같음을 증명합니다

만약 HashSet에 객체를 저장해야 한다면 해당 객체는 hashCode와 equals메서드를 사용해 비교하는 로직을 구현해야 합니다

 

HashSet 데이터 삭제

데이터 삭제는 List컬렉션과 동일하게 remove(Object O)메서드를 사용합니다 Set컬렉션은 index가 존재하지 않으므로 순서에 의한 삭제는 지원하지 않습니다

 

반복자 Iterator

Iterator<E>는 List컬렉션에서 제공하는 인터페이스로 사전적인 의미로는 반복하다라는 뜻을 지니고 있습니다 List 컬렉션의요소를 순회하여 하나씩 추출하는데 사용합니다 E에는 순회할 데이터의 타입을 지정하는데 보통 순회할 컬렉션이 포함하는 데이터 타입과 동일하게 지정합니다 반복자라고도 불리는 Iterator객체는 선언된 컬렉션 객체에서 가져와 사용합니다

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

 

 

Map컬렉션

컬렉션 프레임워크를 설명하는Map은 별도로 분리되어있습니다 Map은 List,Set과 달리Map인터페이스가 별도로 존재하며 데이터를 List계열의 컬렉션과 다르게 처리합니다 Map인터페이스는 데이터를 key와 value로 구분하여 저장하는 방식을 사용합니다 대표적인 Map 컬렉션에 속하는 클래스는 다음과 같습니다

 

Map은 인터페이스를 상속하여 구현한 HashMap,TreeMap, LinkedHashMap이있습니다 이중에서 HashMap은 Map인터페이스를 구현하여 가장 많이 사용하는 대표적인 클래스입니다

해당하는 value값이 업데이트되어 저장되기 때문에 key의 중복에 유의해야합니다 Map의 key와 value는 Entry라는 인터페이스를 상속한 객체에 저장되는데 Entry는 Map 인터페이스 안에서 정의되는 내부인터페이스를 말합니다 

 

Map컬렉션은 Map.Entry 구조를 저장하고 해당객체는 key와 value를 저장합니다 검색을 요구하는 데이터를 저장하는데 효과적이지만 데이터를 저장하고 삭제할 때는 다소 느린편입니다

메서드  기능 설명
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에 담아서 반환

 

 

1 HashMap<K,V>

해싱을 통해 Key의 중복 여부를 판단합니다 즉 key로 지정된 객체의 hashCode와 equals메서드를 이용해 동일 여부를 판단하게 됩니다 HashMap은 Map인터페이스를 상속하여 기능을 구현했기 때문에 Key의 중복을 허용하지 않습니다 만약 중복된 key가 들어오면 지존 key가 지닌 데이터를 업데이트하게 됩니다 

 

HashMap 선언 및 사용법

선언은 이전의 컬렉션 선언과 크게 다르지 않기만 key에 대한 제네릭이 추가되었습니다 

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

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