Java

Java의 컬렉션 프레임워크

꽃달린감나무 2023. 1. 10. 16:39
728x90

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

- 많은 양의 데이터를 처리할 때, 가장 처음 생각나는 것은 배열일 것 입니다. 배열에는 당연하게도 고정적인 크기가 개발을 하는데 있어서 어려운 문제로  꼽힐 것입니다. 이러한 문제점을 해결하고자 나온 것이 컬렉션 프레임워크(collection frame work)입니다. 컬렉션 프레임워크는 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 집합입니다. 쉽게 말하면,  많이 알려져 있는 자료구조를 바탕으로 데이터를 처리하는 알고리즘을 크래스로 구현해 놓은 것이라고 보면됩니다. Java에서는 컬렉션 프레임워클를 Interface를 통해 구현해 놓았습니다.

 

대표적인 컬렉션 프레임워크 인터페이스로는 List 인터페이스, Set 인터페이스, Map 인터페이스가 존재합니다.

 

컬렉션 프레임워크의 상속도

출처 : Java Collections Framework (programiz.com)

(필자는 3분간 생각하다 깨달았다.Collection = 컬렉션 프레임워크)

 

상속도를 통해 List, Set, Queue는 모두 Collection 인터페이스를 상속받고 있습니다. Map 인터페이스 혼자만 떨어져있을까여? Map의 구조 때문에 그렇습니다. List, Set, Queue의 경우, <Element>값이 들어가있지만(경우에 따라 노드의 위치를 가리는 주소값이 들어가 있는 경우가 있습니다. ex : LinkedList), Map의 경우 <key, value>처럼 쌍으로 구조가 이루어져 있기 때문입니다.

 

 

List<Element> 컬렉션

- Collection 인터페이스 중 하나인 List는 객체를 일렬로 쭉 배열한 구조를 가지고 있습니다.  List 컬렉션의 경우 객체를 인텍스(주소)로 관리하기 때문에, 객체를 저장하면, 순서에 맞게 인덱스가 부여됩니다.  List 컬렉션의 경우 데이터 중복 저장을 허용하는데, 이 때 같은 객체를 저장하게 되면, 새롭게 객체가 저장 되는 것이 아니라 객체가 저장되어있는 인덱스를 저장하게됩니다. 즉, 같은 객체라면 같은 주소를 List에 저장하게 되는 겁니다.  Null의 경우는 인덱스가 객체를 참조하지 않습니다.

 

요약 하자면, List의 경우 선형구조이기 때문에, 순서가 저장되고 중복을 허용합니다.

                        

List 구조

List 컬렉션의 대표적인 클래스들은 ArrayList, LinkedList, Vector가 있습니다. 이 클래스들은 List를 상속받고있어 공통적으로 사용하는 메서드들이 있습니다.

메소드  설명
size()  List의 크기를 가져옵니다.
isEmpty() List가 비어 있는지 여부를 확입합니다.
contains(Object o) List에 지정된 요소가 포함된 경우 true를 반환합니다.
 iterator() List의 요소에 대해 기존의 순서에 맞게 Iterator를 반환합니다.
toArray() List의 모든 요소들을 기존의 순서를 맞게 포함하는 배열을 반환합니다.
add(Element e) 지정된 요소를 List의 끝에 추가합니다.
remove(Object o) List에서 지정된 요소를 제거합니다.
retainAll(Collection<?> c) 지정된 컬렉션에 포함된 List 요소만 유지합니다.
clear() List의 모든 요소를 제거합니다.
get(int index) List의 지정된 주소에 있는 요소를 반환합니다.
set(int intdex, E elemnet) List의 지정된 주소에 있는 요소를 지정된 요소로 바꿉니다.

 

 

Set<Element> 컬렉션

List 컬렉션의 경우 요소를 나열하는 구조를 가지고 있어, 추가한 순서대로 객체가 저장되었습니다. Set의 경우는 순서가 없고(순서가 없으므로 List에서 사용했던 get 메소드도 사용할 수 없습니다), 객체를 중복해서 저장할 수 없습니다. 따라서, null값도 한 개만 가지고 있을 수 있습니다. 예시로 로또 번호를 뽑을 때 Set을 사용하면 편리합니다. 

 

대표적인 클래스로는 HashSet, 이진 구조로 저장되는 TreeSet이 있습니다. List와 같이 Collection을 상속받기 때문에 동일한 메소드가 몇 개 존재합니다.

 

메소드 설명
size()  Set의 크기를 반환합니다
isEmpty() Set이 비어 있는지 여부를 확인합니다.
contains(Object o) Set에 지정된 요소가 포함되어 있으면 true를 반환합니다.
iterator() Set의 요소에 대한 Iterator를 순서 없이 반환합니다.
add(E e) 지정된 요소가 아직 없는 경우 Set에 추가합니다.
remove(Object o) 지정된 요소가 있는 경우 Set에서 제거합니다
removeAll(Collection c) 지정된 Collection에 포함된 모든 요소를 Set에서 제거합니다.
clear() Set에서 모든 요소를 제거합니다

 

 

Map<Key, Value> 컬렉션

map 인터페이스는 Collection 인터페이스를 상속받지 않고 java.utill 패키지에 존재합니다. 따라서 List와 Set과는 다르게 동작합니다. 구조는 Map은 파이썬의 dictionaries같이 <Key, Value> 구조로 되어있습니다. Map key를 통해 value 조회를 검색하고 수정할 수 있습니다. 

 

1. Map은 중복 키를 가질 수 없으며, 각 키는 최대 하나의 값에 Mapping 될 수 있습니다. HashMap과 LinkedHashMap에서는같은 <null 키, null 값> 을 허용하지만 TreeMap이를 지양합니다.

 

2. Map의 순서는 TreeMap, LinkedHashMap은 순서를 갖지만, HashMap은 순서를 갖지 않습니다.

 

3. 대표적인 클래스로는 HashMap, TreeMap, LinkedHashMap이 있습니다. 대표적인 인터페이스는 Map, SortedMap이 있습니다.

 

Map 인터페이스의 메소드 Set, List와는 조금 다릅니다.

 

 

메소드 설명 (Mapping = 연결)
clear() Map의 모든 요소 또는 매핑을 지우고 제거합니다.
containsKet(Object o) 특정 키가 Map에 매핑되고 있으면 True를 반환합니다
containsValue(Object o) 특정 값이 Map에서 하나 또는 둘 이상의 키에 매핑(되는 경우 True를 반환합니다.
entrySet() Map에 포함되어있는 key와 value의 매핑을 반환합니다.
equals(Object o) 두 Map에 포함된 요소가 같은지 확인합니다. 같으면 true를 반환합니다.
get(Object o) 매개변수에 있는 키로 매핑된 값을 가져오는 데 사용합니다. 없으면 Null을 반환합니다. 
hashCode() 키와 값을 포함하는 지정된 Map에 대한 HashCode를 생성하는 데 사용합니다.
isEmpty() Map이 비어있는 확인합니다. 비어있으면 true를 반환합니다.
put(Object o, Object o) Map key, value의 매핑을 추가합니다.
remove(Object o) Map에서 매개변수 Key에 대한 매핑을 제거하는 사용됩니다.
size() Map key/ value 쌍의 크기를 반환합니다.
keySet() Map key를 전부 가져옵니다.

 

hashCode란?, 객체를 식별할 수 있는 유니크한 값을 말합니다. 메모리에 생성된 객체의 주소를 정수로 변환한 형태를 애기 합니다. 이 정수는 중복되지 않는 고유의 값입니다.

728x90